java反射


1. 基本概念

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

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

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

  1. 首先获得这个对象对应的Class类的实例
  2. 因为Class这个类存储着一个类的所有信息:属性、方法、构造函数….所以我们可以通过Class类的实例来获取你想要调用的那个方法
  3. 拿到了对应的方法过后,我们可以给这个方法传入对应的参数来调用它。
2. 获取class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

// 通过类字面量
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. 获取类的信息
1
2
3
4
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName());
}
4. 获取类的方法
1
2
3
4
5
6
7
8
Method[] methods = cls.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.getName());
}

// clz.getMethod(方法名,这个方法的参数类型)

Method method = clz.getMethod("setName", String.class);
5. 获取构造函数
1
2
3
4
Constructor<?>[] constructors = cls.getDeclaredConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor.getName());
}
6. 操作字段
1
2
3
4
5
6
7
8
9
10
11
12

// 这是还没有实例 是操作 类
Field field = cls.getDeclaredField("myField");
field.setAccessible(true); // 如果字段是私有的,必须设置可访问性


// 因为必须要 设置属性了,因此需要创建实例

MyClass myObject = new MyClass();
Object value = field.get(myObject);
field.set(myObject, newValue);

7. 操作方法
1
2
3
4
5
6
7
8
9
10
11

Method method = cls.getDeclaredMethod("myMethod", String.class);
method.setAccessible(true); // 如果方法是私有的

User user = new User();
method.invoke(user, "axin");

//这个已经在上面调用过了 Object result = method.invoke(myObject, "argument");

// 第一个参数是调用该方法的对象,第二个参数是一个可变长参


文章作者: K1T0
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 K1T0 !
  目录