1.通过反射来获取某一个类的构造器
1):获取该类的字节码对象.2):从该字节码对象中去找需要获取的构造器.
------------------------------------------------------------------------
Class类获取构造器方法:
Constructor类:表示类中构造器的类型,Constructor的实例就是某一个类中的某一个构造器
public Constructor<?>[] getConstructors():该方法只能获取当前Class所表示类的public修饰的构造器
public Constructor<?>[] getDeclaredConstructors():获取当前Class所表示类的所有的构造器,和访问权限无关
public Constructor<T> getConstructor(Class<?>... parameterTypes) :获取当前Class所表示类中指定的一个public的构造器
参数:parameterTypes表示:构造器参数的Class类型
如:public User(String name)
Constructor c = clz.getConstructor(String.class);
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) :获取当前Class所表示类中指定的一个的构造器
定义一个User类:
public class User {
public User(){
}
public User(String name){
}
//私有的构造器
private User(int age,String name){
}
}
测试:
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.junit.Test;
/**
*
* 说明:获取类中的构造器
*
*/
public class ConstrustorTypeDemo {
//获取String类的公共构造器
@Test
public void testGetContructors() throws Exception {
Class<?> clazz = Class.forName("java.lang.String");
Constructor<?>[] constructors = clazz.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);//获取String类的公共构造方法
}
}
//获取User类的公共的构造器
@Test
public void testUserContructors() throws Exception {
Class<?> clazzClass = Class.forName("_02constructor.User");
Constructor<?>[] constructors = clazzClass.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
//打印结果:只能获取公共的构造方法
//public _02constructor.User()
//public _02constructor.User(java.lang.String)
}
}
//获取User类的所有构造器,包括私有
@Test
public void testDeclaredContructors() throws Exception {
Class<?> clazzClass = Class.forName("_02constructor.User");
Constructor<?>[] declaredConstructors = clazzClass.getDeclaredConstructors();
for (Constructor<?> constructor : declaredConstructors) {
System.out.println(constructor);
//打印结果:能获取包括私有的构造方法
//public _02constructor.User()
//public _02constructor.User(java.lang.String)
//private _02constructor.User(int,java.lang.String)
}
}
//获取User类带有参数的指定的公共的构造器
@Test
public void testGetContructor() throws Exception {
Class<?> clazzClass = Class.forName("_02constructor.User");
Constructor<?> constructor = clazzClass.getConstructor(String.class);
System.out.println(constructor);//public _02constructor.User(java.lang.String)
}
}