java反射

1. 基本概念

反射机制是 Java 提供的一种强大功能,允许程序在运行时查询和操作类的信息

  • Class 类:每个 Java 类在运行时都有一个对应的 Class 对象,包含了该类的所有元数据(如字段、方法、构造函数等)。

  • 反射的用途:反射可以用于动态加载类、获取类的信息、调用方法、访问字段等。它通常用于框架、库或需要动态行为的应用程序中。

  1. 首先获得这个对象对应的Class类的实例
  2. 因为Class这个类存储着一个类的所有信息:属性、方法、构造函数….所以我们可以通过Class类的实例来获取你想要调用的那个方法
  3. 拿到了对应的方法过后,我们可以给这个方法传入对应的参数来调用它。
2. 获取class
// 通过类字面量Class<MyClass> cls1 = MyClass.class;
访问某个类的class属性,这个属性就存储着这个类对应的Class类的实例:Class clz = com.axin.User.class;
// 通过对象MyClass obj = new MyClass();
Class<?> cls2 = obj.getClass();
调用某个对象的getClass()方法:Class clz = (new User()).getClass();
// 通过 ClassLoader调用Class类的静态方法forName获取某个类的Class类实例:Class<?> cls3 = Class.forName("com.example.MyClass");
3. 获取类的信息
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName());
}
4. 获取类的方法
Method[] methods = cls.getDeclaredMethods();	for (Method method : methods) {	
System.out.println(method.getName());	}
// clz.getMethod(方法名,这个方法的参数类型)Method method = clz.getMethod("setName", String.class);
5. 获取构造函数
Constructor<?>[] constructors = cls.getDeclaredConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor.getName());
}
6. 操作字段
// 这是还没有实例 是操作 类 Field field = cls.getDeclaredField("myField");
field.setAccessible(true); // 如果字段是私有的,必须设置可访问性// 因为必须要 设置属性了,因此需要创建实例MyClass myObject = new MyClass();
Object value = field.get(myObject);
field.set(myObject, newValue);
7. 操作方法
Method method = cls.getDeclaredMethod("myMethod", String.class);
method.setAccessible(true); // 如果方法是私有的User user = new User();
method.invoke(user, "axin");
//这个已经在上面调用过了 Object result = method.invoke(myObject, "argument");
// 第一个参数是调用该方法的对象,第二个参数是一个可变长参