Java反射
Java反射
- 反射:在运行时动态获取类的信息(如类名、方法、字段等)并操作这些信息的能力。反射允许程序在运行时检查和修改类的行为。通过反射可以获取一个类的所有属性和方法,并调用这些方法和属性。
- 反射的核心:
Class类。
1. 获取Class对象的方式
- 知道具体类的情况下:
1
Class alunbarClass = TargetObject.class;
- 通过
Class.forName()传入类的路径获取:1
Class alunbarClass = Class.forName("com.example.TargetObject");
- 通过对象实例
instance.getClass()获取:1
2TargetObject targetObject = new TargetObject();
Class alunbarClass = targetObject.getClass(); - 通过类加载器获取:
1
ClassLoader.getSystemClassLoader().loadClass("com.example.TargetObject");
2. 反射的应用
- 创建对线(调用构造器)
1
2
3// 假设clazz是通过上述方式获取的Class对象
Constructor<?> c = clazz.getConstructor(String.class);
Object obj = c.newInstance("example"); - 访问字段(Field)
1
2
3
4
5Field f = clazz.getDeclaredField("name");
f.setAccessible(true); // 如果是私有字段,需要设置可访问
Object value = f.get(obj); // 获取字段值
f.set(obj, "Tom"); // - 调用方法(Method)
1
2
3
4Method m = clazz.getDeclaredMethod("login", String.class);
m.setAccessible(true); // 如果是私有方法,需要设置可访问
m.invoke(obj, "myPassword"); // 调用方法
3. 反射的缺点
- 性能开销:反射操作通常比直接代码调用慢,因为它涉及动态类型检查和方法查找。
- 安全性问题:反射可以绕过访问控制检查,可能导致安全漏洞。
- 可维护性差:过度使用反射会使代码难以理解和维护。
