Java 反射常用方法案例详解
什么是 Java 反射
Java 反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,并可动态修改它的属性。
在 Java 中,提供了一个类“java.lang.Class”来支持反射机制。在使用反射机制时,主要使用的就是这个类。
反射常用方法
获取Class类对象的方法
// 方法一:通过实例对象获取
Object obj = new Object();
Class clazz1 = obj.getClass();
// 方法二:通过类名获取
Class clazz2 = Object.class;
// 方法三:通过类全限定名获取
Class clazz3 = Class.forName("java.lang.Object");
获取类的构造方法
// 获取所有构造方法,包括私有构造方法
Constructor[] constructors = clazz.getConstructors();
Constructor[] constructors = clazz.getDeclaredConstructors();
// 获取指定参数类型的构造方法
Constructor constructor = clazz.getConstructor(String.class, int.class);
Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class);
获取类的字段
// 获取所有公共字段,包括从父类继承的字段
Field[] fields = clazz.getFields();
// 获取该类声明的所有字段,包括私有字段
Field[] fields = clazz.getDeclaredFields();
// 获取指定字段值
Field field = clazz.getField("fieldName");
Object fieldValue = field.get(objectInstance);
field.set(objectInstance, value);
获取类的方法
// 获取指定名称的方法,methodArgs为方法参数
Method method = clazz.getMethod("methodName", methodArgs);
// 获取所有公共方法,包括从父类继承的方法
Method[] methods = clazz.getMethods();
// 获取该类声明的所有方法,包括私有方法
Method[] methods = clazz.getDeclaredMethods();
// 调用方法,objectInstance为实例对象,args为方法参数
Object result = method.invoke(objectInstance, args);
示例
示例1:通过反射调用 private 方法
import java.lang.reflect.Method;
public class PrivateMethodDemo {
public static void main(String[] args) throws Exception {
Class<?> clazz = PrivateMethodClass.class;
Method method = clazz.getDeclaredMethod("privateMethod");
// 禁止访问私有方法的执行权限检查,否则会报 IllegalAccessException 异常
method.setAccessible(true);
method.invoke(clazz.newInstance());
}
}
class PrivateMethodClass {
private void privateMethod() {
System.out.println("This is a private method.");
}
}
执行结果:
This is a private method.
示例2:通过反射修改 final 字段
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class FinalFieldDemo {
public static void main(String[] args) throws Exception {
Student student = new Student("Tom", 18);
Class<?> clazz = student.getClass();
Field fieldAge = clazz.getDeclaredField("age");
// 禁止访问私有字段的访问权限检查,否则会报 IllegalAccessException 异常
fieldAge.setAccessible(true);
// 去除 final 修饰符
Field fieldModifiers = Field.class.getDeclaredField("modifiers");
fieldModifiers.setAccessible(true);
fieldModifiers.setInt(fieldAge, fieldAge.getModifiers() & ~Modifier.FINAL);
fieldAge.setInt(student, 20);
System.out.println(student);
}
}
class Student {
private String name;
private final int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
执行结果:
Student{name='Tom', age=20}
总结
本篇文章向大家介绍了 Java 反射常用方法,包括获取 Class 类对象的方法、获取类的构造方法、获取类的字段、获取类的方法。并通过两个示例展示了反射机制的实际应用场景。反射机制的应用可以使我们在运行时动态地获取和操作类的属性和方法,极大地提高代码的灵活性和可读性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java反射常用方法案例详解 - Python技术站