java反射
获取Class对象的方式
- Class.forName("全类名"): 将字节码文件加载进内存,返回class对象
- 多用于配置文件,将类名定义在配置文件中,读取文件加载类
- 类名.class:通过类名的class属性来获取
- 多用于参数的传递
- 对象.getClass(): 通过对象的getClass方法来获取
-
多用于对象的获取字节码方式
package reflect;
public class Reflect {
// 获取class的三种方式 public static void main(String[] args) throws ClassNotFoundException { //1.Class.forName("全类名"): 将字节码文件加载进内存,返回class对象 Class cls1 = Class.forName("reflect.Person"); System.out.println(cls1); //2类名.class:通过类名的class属性来获取 Class cls2 = Person.class; System.out.println(cls2); //3.对象.getClass(): 通过对象的getClass方法来获取 Person person = new Person(); Class cls3 = person.getClass(); System.out.println(cls3); // 比较三个对象 System.out.println(cls1 == cls2); //true System.out.println(cls1 == cls3); //true }
}
-
同一个字节码文件(*.class)在程序运行过程中,只会被加载一次,不论通过哪一种方式获取的class对象都是同一个
使用class对象
- 获取功能
- 获取成员变量
- Field[] getFields()
- 获取所有public修饰的成员变量
- Field getField(String name)
- Field[] getDeclaredFields()
- Field getDeclaredField(String name)
- Field[] getFields()
- 获取构造方法们
- Constructor<?>[] getConstructors()
- Constructor
getConstructor(类<?>... parameterTypes) - Constructor<?>[] getDeclaredConstructors()
- Constructor
getDeclaredConstructor(类<?>... parameterTypes)
- 获取成员方法们
- Method[] getMethods()
- Method getMethod(String name, 类<?>... parameterTypes)
- Method[] getDeclaredMethods()
- Method getDeclaredMethod(String name, 类<?>... parameterTypes)
- 获取类其他属性
- 获取类名
- String Name getName()
- 获取类名
- Field: 成员变量
- 操作:
- 设置值:
- void set(Object obj, Object value);
- 设置值:
- get(Object obj)
- 暴力反射
- setAccessible(true)
- 设置值:
- 操作:
- Constructor:
- 创建对象:
- newInstance: 创建对象
- 创建对象:
- Method
- 执行方法:
- invoke(Object obj, Object... args)
- 获取方法的名称
- getName
- 执行方法:
- 获取成员变量
-
package reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Reflect { // 获取class的三种方式 public static void main(String[] args) throws Exception { Class<?> cls1 = Class.forName("reflect.Person"); // - 获取成员变量 // - Field[] getFields() Field[] fields = cls1.getFields(); for (Field field : fields) { System.out.println(field); } Field sex = cls1.getField("sex"); Person person = new Person(); // 获取值 Object value = sex.get(person); System.out.println(value); // 设置值 sex.set(person, "男"); System.out.println(person.sex); // 获取所有的成员变量,不考虑成员修饰符 Field[] declaredFields = cls1.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println(declaredField); } Field name = cls1.getDeclaredField("name"); // 忽略访问权限修饰符的安全检查--> 暴力反射 name.setAccessible(true); Object o = name.get(person); System.out.println(o); // 获取构造方法 Constructor<?> constructor = cls1.getConstructor(String.class, int.class); System.out.println(constructor); // 创建对象 Object ivy = constructor.newInstance("IVY", 23); System.out.println(ivy); // 获取成员方法们 Method[] methods = cls1.getMethods(); for (Method method : methods) { System.out.println(method); } // 获取指定的方法 // 空参方法获取 Method eat = cls1.getMethod("eat"); eat.invoke(person); // 有参方法获取 Method say = cls1.getMethod("say", String.class); say.invoke(person, "123"); // 获取类名 String name1 = cls1.getName(); System.out.println(name1); } }