Java 反射机制:(九)获取运行时类的构造器结构

一、获取构造器结构

  1、getConstructors()

    getConstructors():获取当前运行时类中声明为public的构造器

    Demo:

 1    @Test
 2     public void test1() {
 3 
 4         Class clazz = Person.class;
 5         //getConstructors():获取当前运行时类中声明为public的构造器
 6         Constructor[] constructors = clazz.getConstructors();
 7         for (Constructor c : constructors) {
 8             System.out.println(c);
 9         }
10     }

    运行结果:

    

  2、getDeclaredConstructors()

    getDeclaredConstructors():获取当前运行时类中声明的所有的构造器

    Demo:

 1     @Test
 2     public void test2() {
 3 
 4         Class clazz = Person.class;
 5         //getDeclaredConstructors():获取当前运行时类中声明的所有的构造器
 6         Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
 7         for(Constructor c : declaredConstructors){
 8             System.out.println(c);
 9         }
10     }

    运行结果:

    

  3、getConstructor(类<?> ..., parameterTypes)

    getConstructor():根据构造方法参数类型获取当前运行时类中指定的 public 修饰的构造器

    Demo:

1     @Test
2     public void test11() throws NoSuchMethodException {
3 
4         Class clazz = Person.class;
5         //getConstructor():获取当前运行时类中所有的public修饰的构造器
6         Constructor constructor = clazz.getConstructor();
7         System.out.println(constructor);
8     }

  4、getDeclaredConstructor()

    getDeclaredConstructor():根据参数类型获取当前运行时类中指定的构造器(忽略权限修饰符)

    Demo:

1     @Test
2     public void test11() throws NoSuchMethodException {
3 
4         Class clazz = Person.class;
5         //getDeclaredConstructor():获取当前运行时类中指定的构造器
6         Constructor constructor = clazz.getDeclaredConstructor(String.class);
7         System.out.println(constructor);
8     }

二、关于构造器

    说明:

      ① 构造器名称无需指定,因为它和类名一致;

      ② parameterTypes 参数是 Class 对象的一个数组,它按声明顺序标识构造方法的形参类型。

      ③ 如果此 Class 对象表示非静态上下文中声明的内部类,则形参类型作为第一个参数包括显示封闭的实例;

    Demo:

 1 public class TestConstructor{
 2     @Test
 3     public void test7() throws Exception{
 4         Class<?> clazz = Outer.class;
 5         Constructor<?> constructor = clazz.getDeclaredConstructor();
 6         System.out.println(constructor);//无参构造
 7         
 8         Class<?> c = Outer.Inner.class;
 9         //因为Inner是非静态的内部类,所以它的构造器,默认第一个形参是外部类的实例对象
10         Constructor<?> cs = c.getDeclaredConstructor(Outer.class);
11         System.out.println(cs);
12     }
13 }
14 class Outer{
15     class Inner{
16         
17     }
18 }

    Demo2:

 1     @Test
 2     public void test8(){
 3         Class<?> clazz = String.class;
 4         Constructor<?>[] constructors = clazz.getConstructors();
 5         for (Constructor<?> constructor : constructors) {
 6             int mod = constructor.getModifiers();                         //获取构造器修饰符
 7             String name = constructor.getName();                          //获取构造器名字
 8             Class<?>[] parameterTypes = constructor.getParameterTypes();  //获取构造器参数列表
 9             System.out.print(Modifier.toString(mod)+"	" + name + "(");
10             System.out.println(Arrays.toString(parameterTypes)+")");
11         }
12     }

三、

原文地址:https://www.cnblogs.com/niujifei/p/14887441.html