Java反射机制详解
Java反射机制是指在运行时使用Reflection API动态获取类信息、构造对象、调用方法、访问属性等。反射机制在框架开发、ORM映射、动态代理、JavaBean工具、JUnit单元测试等领域有着广泛的应用。
反射机制的特性
Java反射机制具有以下特性:
- 运行时类型信息:反射机制可以获取类的各种信息,例如类名、父类、接口、方法、属性、注解等。
- 动态性:反射机制可以在运行时动态创建对象、调用方法、访问属性。
- 开发便利性:反射机制可以实现JavaBean操作、框架开发、ORM映射等功能,提高开发效率。
反射机制的基本使用
Java反射机制的主要类有Class、Constructor、Method、Field、Annotation等。
- 获取Class对象
使用Java反射机制,需要先获取Class对象,有以下三种方式:
- 通过类名获取:Class.forName("com.example.User");
- 通过类实例获取:user.getClass();
- 通过类字面常量获取:User.class。
Class<User> userClass = User.class;
- 创建对象
Java反射机制可以动态创建对象,有以下两种方式:
- 调用无参构造方法:Class.newInstance()。
- 调用带参构造方法:Constructor.newInstance(args...)。
// 调用无参构造方法
User user1 = userClass.newInstance();
// 调用有参构造方法
Constructor<User> constructor = userClass.getConstructor(String.class, Integer.class);
User user2 = constructor.newInstance("Tom", 18);
- 调用方法
反射机制可以动态调用方法,有以下两种方式:
- 调用无参方法:Method.invoke(obj)。
- 调用有参方法:Method.invoke(obj, args...)。
// 调用无参方法
Method getNameMethod = userClass.getMethod("getName");
String name = (String) getNameMethod.invoke(user1);
// 调用有参方法
Method setNameMethod = userClass.getMethod("setName", String.class);
setNameMethod.invoke(user1, "Jack");
- 访问属性
反射机制可以动态访问属性,有以下两种方式:
- 直接获取属性值:Field.get(obj)。
- 直接设置属性值:Field.set(obj, value)。
// 直接获取属性值
Field ageField = userClass.getDeclaredField("age");
ageField.setAccessible(true);
int age = ageField.getInt(user1);
// 直接设置属性值
ageField.setInt(user1, 20);
- 获取注解
反射机制可以获取类、方法、属性的注解,有以下两种方式:
- 获取单个注解:Class.getAnnotation、Method.getAnnotation、Field.getAnnotation。
- 获取所有注解:Class.getDeclaredAnnotations、Method.getDeclaredAnnotations、Field.getDeclaredAnnotations。
// 获取类的注解
MyAnnotation classAnnotation = userClass.getAnnotation(MyAnnotation.class);
// 获取方法的注解
Method getNameMethod = userClass.getMethod("getName");
MyAnnotation methodAnnotation = getNameMethod.getAnnotation(MyAnnotation.class);
// 获取属性的注解
Field ageField = userClass.getDeclaredField("age");
MyAnnotation fieldAnnotation = ageField.getAnnotation(MyAnnotation.class);
反射机制的注意事项
- 反射机制性能较低,在频繁调用时应尽量缓存Class对象,避免重复获取。
- 反射机制获取的是运行时信息,编译期类型安全检查无法发挥作用,容易引发类型转换异常。
- 反射机制不能访问私有方法和属性,需要通过setAccessible(true)设置可访问权限。
示例说明
以下两个示例分别演示了使用反射机制调用类的无参方法和有参方法。
public class UserService {
public void sayHello() {
System.out.println("Hello world!");
}
public void sayHi(String name) {
System.out.println("Hi, " + name);
}
}
public class Main {
public static void main(String[] args) throws Exception {
Class<UserService> userServiceClass = UserService.class;
// 调用无参方法
Method sayHelloMethod = userServiceClass.getMethod("sayHello");
sayHelloMethod.invoke(userServiceClass.newInstance());
// 调用有参方法
Method sayHiMethod = userServiceClass.getMethod("sayHi", String.class);
sayHiMethod.invoke(userServiceClass.newInstance(), "Tom");
}
}
运行结果:
Hello world!
Hi, Tom
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 反射机制详解及实例代码 - Python技术站