import java.lang.reflect.Constructor; /** * @author * @date 2018/7/31 * @描述 利用反射获取对象的构造方法 */ public class GetConstructDemo { public static void main(String[] args) throws Exception { // 利用反射获取公有成员变量的步骤 // 1. 获取反射对象(3种方法) Class aClass = Student.class; // 2. 使用方法获取构造方法的对象 Constructor constructor = aClass.getConstructor(String.class, int.class, String.class); // 3. 使用Constructor对象初始化对象 Object obj = constructor.newInstance("张三", 23, "男"); // 测试输出结果 System.out.println(obj); System.out.println("==================================="); // 无参构造的方法 // 1. 获取反射对象(3种方法) Class aClass1 = Student.class; // 2. 使用方法获取构造方法的对象 Constructor constructor1 = aClass1.getConstructor(); // 3. 使用Constructor初始化对象 Object obj1 = constructor1.newInstance(); // 测试输出结果 System.out.println(obj1); // 还有个简化写法,仅仅适用于无参构造,但是我使用JDK10已经不推荐使用了 Object obj2 = aClass1.newInstance(); System.out.println(obj2); // getDeclaredConstructor方法也是获取私有的构造方法,就不演示了 } } |
Method:方法对象
执行方法:
Object invoke(Object obj, Object... args)
获取方法名称:
String getName:获取方法名
首先在Student中添加两个方法
public void eat(){ System.out.println("eat.............."); } public int add(int a, int b){ return a + b; } package com.wzlove.reflect; import java.lang.reflect.Method; /** * @author 王智 * @date 2018/7/31 * @描述 反射执行方法 */ public class GetMethodDemo { public static void main(String[] args) throws Exception { // 无参无返回值的方法 // 1. 创建字节码对象 Class aClass = Student.class; // 2. 创建方法的对象 Method eat = aClass.getMethod("eat"); // 3. 执行方法 Student stu = new Student(); eat.invoke(stu); // 有参有返回值的方法 // 1. 创建字节码对象 Class aClass1 = Student.class; // 2. 创建方法的对象 Method add = aClass1.getMethod("add", int.class,int.class); // 3. 执行方法 Student stu1 = new Student(); Object sum = add.invoke(stu1, 10, 10); System.out.println("和为" + sum); System.out.println("======================================================"); // 获取该类所有的方法(这里获取的不仅仅是自己定义的方法,还有从父类继承来的方法) Method[] methods = aClass1.getMethods(); for (Method method : methods) { System.out.println(method); System.out.println(method.getName()); } System.out.println("======================================================"); // 获取类名 System.out.println(aClass1.getName()); // getDeclaredMethod也是同样的道理 } } |
以上就是反射的简单使用了.举个简单例子,当然这个例子并不完善,将就看
package com.wzlove.reflect; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.Properties; /** * @author * @date 2018/7/31 * @描述 * * 案例: * * 需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象, * 并且执行其中任意方法 * * 实现: * 1. 配置文件 * 2. 反射 * * 步骤: * 1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中 * 2. 在程序中加载读取配置文件 * 3. 使用反射技术来加载类文件进内存 * 4. 创建对象 * 5. 执行方法 */ public class ReflectDemo { public static void main(String[] args) throws Exception { // 创建本类的字节码对象 Class aClass = ReflectDemo.class; // 获取类加载器对象 ClassLoader classLoader = aClass.getClassLoader(); // 加载配置文件,返回字节流对象 InputStream resourceAsStream = classLoader.getResourceAsStream("pro.properties"); // 读取配置文件 // 创建Properties对象 Properties properties = new Properties(); properties.load(resourceAsStream); // 反射的使用 Object className = properties.getProperty("className"); Object methodName = properties.getProperty("methodName"); // 使用反射创建对象 Class aClass1 = Class.forName((String) className); Constructor constructor = aClass1.getConstructor(); Object obj = constructor.newInstance(); // 利用反射获取方法 Method method = aClass1.getMethod((String) methodName); // 使用反射执行方法 method.invoke(obj); } } |
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。