Java反射机制深入理解:实战示例
Java反射机制是一种强大的特性,它允许程序在运行时访问、检查和修改它自己的结构,包括类、接口、字段和方法。以下是一些关于Java反射机制的深入理解和实战示例。
1.理解反射反射机制主要通过java.lang.Class
类和java.lang.reflect
包来实现。它允许程序在运行时:
- 获取类的信息(如类名、方法、字段等)
- 创建类的实例-调用方法-访问和修改字段的值###2. 获取Class对象获取
Class
对象有三种方式:
-通过直接调用类型的.class
属性-通过实例调用.getClass()
方法-通过Class.forName()
方法,传入类的全名###3. 创建实例使用Class
对象的newInstance()
方法可以创建类的实例,但这个方法已经被废弃,推荐使用Constructor
类的newInstance()
方法。
javaClass<?> clazz = Class.forName("com.example.MyClass");
Object instance = clazz.getDeclaredConstructor().newInstance();
###4.访问和修改字段通过Field
对象可以访问和修改类的字段。
javaField field = clazz.getDeclaredField("fieldName");
field.setAccessible(true); //忽略访问控制检查field.set(instance, value); // 设置字段值
###5.调用方法通过Method
对象可以调用类的方法。
javaMethod method = clazz.getDeclaredMethod("methodName", paramTypes);
method.setAccessible(true); //忽略访问控制检查Object result = method.invoke(instance, args); //调用方法
###6. 实战示例假设有一个简单的类Person
,我们使用反射来创建实例、访问和修改字段、调用方法。
```javapublic class Person {
private String name;
private int age;
public Person() {}
public void sayHello() {
System.out.println(“Hello, my name is “ + name + “ and I am “ + age + “ years old.”);
}
}
public class ReflectionTest {
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName(“Person”);
Object personInstance = clazz.getDeclaredConstructor().newInstance();
//访问和修改字段Field nameField = clazz.getDeclaredField(“name”);
nameField.setAccessible(true);
nameField.set(personInstance, “Kimi”);
Field ageField = clazz.getDeclaredField(“age”);
ageField.setAccessible(true);
ageField.set(personInstance,30);
//调用方法Method sayHelloMethod = clazz.getDeclaredMethod(“sayHello”);
sayHelloMethod.setAccessible(true);
sayHelloMethod.invoke(personInstance);
}
}
```###7. 注意事项-反射会破坏封装性,因为它可以访问私有成员。
-反射比直接代码调用慢,因为它需要动态解析信息。
- 使用
setAccessible(true)
可以访问私有成员,但可能会引发安全问题。
反射是Java中一个强大的工具,但应该谨慎使用,以避免潜在的问题。
还没有评论,来说两句吧...