Java中的反射机制允许我们在运行时操作类、方法、属性等信息。获取Constructor、Field、Method对象是反射机制的基础操作,下面详细介绍Java如何通过反射获取Constructor、Field、Method对象的完整攻略。
获取Constructor对象
获取Constructor对象的过程需要通过Class对象的getConstructor()、getDeclaredConstructor()、getConstructors()、getDeclaredConstructors()等方法进行。其中,getConstructor()和getConstructors()方法返回的都是特定公共构造方法的对象;getDeclareConstructor()和getDeclaredConstructors()方法返回的是特定构造方法的对象,无论它是否私有。
import java.lang.reflect.Constructor;
public class Student {
private String name;
private int age;
public Student() {}
protected Student(String name) {
this.name = name;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
//使用Class.forName方法获取Class对象
Class c = Class.forName("com.demo.Student");
//获取指定公共构造函数
Constructor c1 = c.getConstructor();
System.out.println("c1: " + c1);
//获取所有公共构造函数
Constructor[] cons1 = c.getConstructors();
for(Constructor cons : cons1) {
System.out.println("cons1: " + cons);
}
//获取指定构造函数
Constructor c2 = c.getDeclaredConstructor(String.class, int.class);
System.out.println("c2: " + c2);
//获取所有构造函数
Constructor[] cons2 = c.getDeclaredConstructors();
for(Constructor cons : cons2) {
System.out.println("cons2: " + cons);
}
}
}
在上面的示例中,我们成功获取了Student类中各种构造函数的Constructor对象,并进行了输出。
获取Field对象
获取Field对象的过程需要通过Class对象的getField()、getDeclaredField()、getFields()、getDeclaredFields()等方法进行。其中,getField()和getFields()方法返回的都是特定公共属性的对象;getDeclareField()和getDeclaredFields()方法返回的是特定属性的对象,无论它是否私有。
import java.lang.reflect.Field;
public class Student {
private String name;
private int age;
public String school;
public Student() {}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
//使用Class.forName方法获取Class对象
Class c = Class.forName("com.demo.Student");
//获取指定公共属性
Field f1 = c.getField("school");
System.out.println("f1: " + f1);
//获取所有公共属性
Field[] fields = c.getFields();
for(Field f : fields) {
System.out.println("field: " + f);
}
//获取指定属性
Field f2 = c.getDeclaredField("name");
System.out.println("f2: " + f2);
//获取所有属性
Field[] declaredFields = c.getDeclaredFields();
for(Field f : declaredFields) {
System.out.println("declaredField: " + f);
}
}
}
在上面的示例中,我们成功获取了Student类中各种属性的Field对象,并进行了输出。
获取Method对象
获取Method对象的过程需要通过Class对象的getMethod()、getDeclaredMethod()、getMethods()、getDeclaredMethods()等方法进行。其中,getMethod()和getMethods()方法返回的都是特定公共方法的对象;getDeclareMethod()和getDeclaredMethods()方法返回的是特定方法的对象,无论它是否私有。
import java.lang.reflect.Method;
public class Student {
private String name;
private int age;
public Student() {}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private void printName() {
System.out.println(name);
}
}
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
//使用Class.forName方法获取Class对象
Class c = Class.forName("com.demo.Student");
//获取指定公共方法
Method m1 = c.getMethod("setName", String.class);
System.out.println("m1: " + m1);
//获取所有公共方法
Method[] methods = c.getMethods();
for(Method m : methods) {
System.out.println("method: " + m);
}
//获取指定方法
Method m2 = c.getDeclaredMethod("printName");
System.out.println("m2: " + m2);
//获取所有方法
Method[] declaredMethods = c.getDeclaredMethods();
for(Method m : declaredMethods) {
System.out.println("declaredMethod: " + m);
}
}
}
在上面的示例中,我们成功获取了Student类中各种方法的Method对象,并进行了输出。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java如何通过反射获取Constructor、Field、Method对象 - Python技术站