Java 反射 代码详解
package com.lidaochen.test; public class CPerson { private int age; private String name; public String a; protected String b; String c; private String d; public CPerson(int age, String name) { this.age = age; this.name = name; } public CPerson() { } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
1、获取字节码Class对象的三种方式
package com.lidaochen.test; public class CJavaDemo { public static void main(String[] args) throws Exception{ // 1、Class.forName("全类名") Class class1 = Class.forName("com.lidaochen.test.CPerson"); System.out.println(class1); // 2、类名.class Class class2 = CPerson.class; System.out.println(class2); // 3、对象.getClass() CPerson person = new CPerson(); Class class3 = person.getClass(); System.out.println(class3); // 比较三个对象 System.out.println(class1 == class2); System.out.println(class1 == class3); } }
2、通过 Class 对象获取 Field
package com.lidaochen.test; import java.lang.reflect.Field; public class CJavaDemo { public static void main(String[] args) throws Exception{ // 0、获取 CPerson 的 Class 对象 Class mem = CPerson.class; // 1、getFields()获取所有public修饰的成员变量 Field[] fields = mem.getFields(); for (Field field : fields) { System.out.println(field); } System.out.println("--------------------"); // 2、Field getField(String name) Field a = mem.getField("a"); // 获取成员变量 a 的值 CPerson person = new CPerson(); Object value = a.get(person); System.out.println(value); // 设置成员变量 a 的值 a.set(person, "李道臣"); value = a.get(person); System.out.println(value); System.out.println("--------------------"); // 3、Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符 Field[] declaredFields = mem.getDeclaredFields(); for (Field field : declaredFields) { System.out.println(field); } System.out.println("--------------------"); // 4、Field getDeclaredField(String name) Field d = mem.getDeclaredField("d"); // 忽略访问权限修饰符的安全检查(暴力反射) d.setAccessible(true); value = d.get(person); System.out.println(value); } }
3、通过 Class 对象功能获取 Constructor
package com.lidaochen.test; import java.lang.reflect.Constructor; public class CJavaDemo { public static void main(String[] args) throws Exception{ // 0、获取 CPerson 的 Class 对象 Class mem = CPerson.class; // 1、获取带参数的 Constructor Constructor constructor = mem.getConstructor(int.class, String.class); System.out.println(constructor); // 创建对象 Object person1 = constructor.newInstance(20, "李道臣"); System.out.println(person1); System.out.println("--------------------"); // 2、获取不带参数的 Constructor constructor = mem.getConstructor(); System.out.println(constructor); // 创建对象 Object person2 = constructor.newInstance(); System.out.println(person1); // 无参构造创建对象 还可以这样创建 Object person3 = mem.newInstance(); System.out.println(person3); } }
4、通过 Class 对象 获取 Method
package com.lidaochen.test; import java.lang.reflect.Method; public class CJavaDemo { public static void main(String[] args) throws Exception{ // 0、获取 CPerson 的 Class 对象 Class mem = CPerson.class; // 1、获取指定名称的方法 CPerson p = new CPerson(); // 不带参数 Method eat_method1 = mem.getMethod("eat"); eat_method1.invoke(p); // 带参数 Method eat_method2 = mem.getMethod("eat", String.class); eat_method2.invoke(p, "西瓜"); System.out.println("--------------------"); // 2、获取所有public修饰的方法 Method[] methods = mem.getMethods(); for (Method method : methods) { System.out.println(method); } System.out.println("--------------------"); // 3、获取类名 String className = mem.getName(); System.out.println(className); } }
5、实例:通过Java反射,动态执行任何类的任何方法
package com.lidaochen.test; import java.io.BufferedReader; import java.io.FileReader; import java.lang.reflect.Method; import java.util.Properties; public class CJavaDemo { public static void main(String[] args) throws Exception{ // 1、加载配置文件 Properties properties = new Properties(); BufferedReader bufferedReader = new BufferedReader(new FileReader("F:/Projects/JavaDemo/option.properties")); properties.load(bufferedReader); // 2、获取配置文件中定义的数据 String className = properties.getProperty("className"); String methodName = properties.getProperty("methodName"); // 3、加载该类进内存 Class cls = Class.forName(className); // 4、创建对象 Object obj = cls.newInstance(); // 5、获取方法对象 Method method = cls.getMethod(methodName); // 6、执行方法 method.invoke(obj); } }