Java通过反射访问构造方法
Java通过反射访问构造方法可以使用Class类的以下方法:
1. getConstructor()方法:获取指定参数类型的公共构造方法。
2. getDeclaredConstructor()方法:获取指定参数类型的所有构造方法,包括公共、私有和受保护的构造方法。
3. getConstructors()方法:获取所有公共构造方法。
4. getDeclaredConstructors()方法:获取所有构造方法,包括公共、私有和受保护的构造方法。
通过这些方法获取到构造方法对象后,可以使用Constructor类的以下方法进行操作:
1. newInstance()方法:使用构造方法创建一个新的对象。
2. setAccessible()方法:设置构造方法的可访问性,即使是私有构造方法也可以访问。
例如,假设有一个类Person,通过反射访问其构造方法的示例代码如下:
import java.lang.reflect.Constructor;
public class Main {
public static void main(String[] args) throws Exception {
Class<?> clazz = Person.class;
// 获取指定参数类型的公共构造方法
Constructor<?> publicConstructor = clazz.getConstructor(String.class, int.class);
Person person1 = (Person) publicConstructor.newInstance("Alice", 25);
System.out.println(person1.getName() + " " + person1.getAge());
// 获取所有公共构造方法
Constructor<?>[] publicConstructors = clazz.getConstructors();
for (Constructor<?> constructor : publicConstructors) {
System.out.println(constructor);
}
// 获取指定参数类型的所有构造方法,包括公共、私有和受保护的构造方法
Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(String.class);
declaredConstructor.setAccessible(true);
Person person2 = (Person) declaredConstructor.newInstance("Bob");
System.out.println(person2.getName() + " " + person2.getAge());
// 获取所有构造方法,包括公共、私有和受保护的构造方法
Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
for (Constructor<?> constructor : declaredConstructors) {
System.out.println(constructor);
}
}
}
class Person {
private String name;
private int age;
public Person() {
}
public Person(String name) {
this.name = name;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
上述代码中,我们通过反射获取了Person类的各种构造方法,并通过构造方法创建了不同的Person对象。