欢迎访问宙启技术站
智能推送

使用Java反射的10个常见操作

发布时间:2023-05-31 16:01:49

Java反射是Java语言中提供的一种特殊机制,它允许程序在运行时动态地获取类信息、创建对象、调用方法和访问成员变量等。反射机制可以使程序更加灵活,但也增加了复杂性和开销。在此,我们将介绍Java反射的10个常见操作,方便您理解和应用。

1. 获取Class对象

Java反射的 步是获取待操作的Class对象。可以通过类名、对象、类字面值等方式获得Class对象。

//获取类名对应的Class对象
Class<?> clazz = Class.forName("com.example.ClassName");

//获取对象的Class对象
Object obj = new ClassName(); 
Class<?> clazz = obj.getClass(); 

//获取类字面值的Class对象
Class<?> clazz = ClassName.class;

2. 创建对象

通过Java反射可以在运行时动态地创建对象。可以使用Class对象的newInstance()方法或构造函数的newInstance()方法创建对象。

//使用Class对象的newInstance()方法创建对象
Object object = clazz.newInstance();

//使用无参构造函数的newInstance()方法创建对象
Object object = clazz.getDeclaredConstructor().newInstance();

//使用有参构造函数的newInstance()方法创建对象
Class<?>[] parameterTypes = {int.class, String.class};
Object[] args = {1, "example"};
Object object = clazz.getDeclaredConstructor(parameterTypes).newInstance(args);

3. 获取方法

Java反射可以在运行时获取Class对象中的方法信息。可以使用Class对象的getMethod()或getDeclaredMethod()方法获取方法对象。

//获取public方法对象
Method publicMethod = clazz.getMethod("publicMethod");

//获取私有方法对象
Method privateMethod = clazz.getDeclaredMethod("privateMethod");
privateMethod.setAccessible(true);

4. 调用方法

Java反射可以在运行时动态地调用对象的方法。可以使用Method对象的invoke()方法调用方法。

//调用无参无返回值的方法
publicMethod.invoke(object);

//调用有参无返回值的方法
Class<?>[] parameterTypes = {int.class, String.class};
Object[] args = {1, "example"};
publicMethod.invoke(object, args);

//调用有参有返回值的方法
int result = (int)publicMethod.invoke(object, args);

5. 获取成员变量

Java反射可以在运行时获取Class对象中的成员变量信息。可以使用Class对象的getField()或getDeclaredField()方法获取成员变量对象。

//获取public成员变量对象
Field publicField = clazz.getField("publicField");

//获取私有成员变量对象
Field privateField = clazz.getDeclaredField("privateField");
privateField.setAccessible(true);

6. 获取父类信息

Java反射可以在运行时获取Class对象的父类信息。可以使用Class对象的getSuperclass()方法获取父类的Class对象。

//获取父类的Class对象
Class<?> superClass = clazz.getSuperclass();

7. 获取接口信息

Java反射可以在运行时获取Class对象所实现的接口信息。可以使用Class对象的getInterfaces()方法获取接口的Class对象数组。

//获取实现的接口的Class对象数组
Class<?>[] interfaces = clazz.getInterfaces();

8. 获取类信息

Java反射可以在运行时获取Class对象的类信息,包括类的访问修饰符、类名、父类、实现接口和成员变量等。可以使用Class对象的getModifiers()、getName()、getSuperclass()、getInterfaces()和getFields()等方法获取类信息。

//获取访问修饰符
int modifiers = clazz.getModifiers();

//获取类名
String name = clazz.getName();

//获取父类的Class对象
Class<?> superClass = clazz.getSuperclass();

//获取实现的接口的Class对象数组
Class<?>[] interfaces = clazz.getInterfaces();

//获取public成员变量对象
Field[] fields = clazz.getFields();

9. 修改成员变量

Java反射可以在运行时动态地修改对象的成员变量。可以使用Field对象的set()方法修改成员变量。

//修改public成员变量的值
publicField.set(object, "new value");

//修改私有成员变量的值
privateField.setAccessible(true);
privateField.set(object, "new value");

10. 获取注解信息

Java反射可以在运行时获取Class对象、方法或者成员变量上的注解信息。可以使用Class对象、Method对象或Field对象的getAnnotation()方法获取注解信息。

//获取类上的注解信息
Annotation annotation = clazz.getAnnotation(AnnotationClass.class);

//获取方法上的注解信息
Annotation annotation = method.getAnnotation(AnnotationClass.class);

//获取成员变量上的注解信息
Annotation annotation = field.getAnnotation(AnnotationClass.class);

以上是Java反射的10个常见操作,涉及到Class对象、创建对象、获取方法、调用方法、获取成员变量、获取父类、获取接口、获取类信息、修改成员变量和获取注解信息等。

使用Java反射可以使程序更加灵活,但也增加了复杂性和开销。因此,在实际开发中应慎重使用反射机制,避免带来不必要的性能损耗和安全隐患。