java 27 - 3 反射之 通过反射获取构造方法并使用
Posted 卡拉瓦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 27 - 3 反射之 通过反射获取构造方法并使用相关的知识,希望对你有一定的参考价值。
类 Constructor<T>:提供关于类的单个构造方法的信息以及对它的访问权限。
通过反射的方法获取构造方法并使用 ps:先忽略泛型
A.1:获取构造方法的数组:
public Constructor<?>[] getConstructors():获得所有公共构造方法
public Constructor<?>[] getDeclaredConstructors():获得所有构造方法
A.2:获取单个构造方法(用于非私有的构造方法)
public Constructor<T> getConstructor(Class<?>... parameterTypes)
参数表示的是:你要获取的构造方法的构造参数个数及数据类型的class字节码文件对象
A.3:获取单个构造方法(用于私有的构造方法)
public Constructor<T> getDeclaredtConstructor(Class<?>... parameterTypes)
B.1:初始化构造方法的实例:(用于非私有的构造方法)
public T newInstance(Object... initargs) 注意:T表示的是泛型,Object... initargs表示的是你要实例化的指定参数
使用此 Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
B.2:初始化构造方法的实例:(用于私有的构造方法)
先用: public void setAccessible(boolean flag):flag的值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
再用: public T newInstance(Object... initargs)
代码:
A:public Constructor<?>[] getConstructors():获得所有公共构造方法
1 Constructor[] c1 = c.getConstructors(); 2 System.out.println(c1);// 返回的是地址值,证明得到的是个数组对象 3 // 遍历这个数组 4 for (Constructor ct : c1) { 5 System.out.println(ct); 6 } //获得Person类中的所有公告构造方法
B:public Constructor<?>[] getDeclaredConstructors():获得所有构造方法
1 // B:public Constructor<?>[] getDeclaredConstructors():获得所有构造方法 2 Constructor[] c1 = c.getDeclaredConstructors(); 3 //遍历数组 4 for(Constructor ct : c1){ 5 System.out.println(ct); 6 } //获得Person类的所有构造方法
C:public Constructor<T> getConstructor(Class<?>... parameterTypes):获得指定的构造方法
获得无参构造方法:
1 Constructor c1 = c.getDeclaredConstructor(); 2 System.out.println(c1);
获得带参构造方法:
1 //获取指定的构造方法,需要该方法的参数列表 2 Constructor c1 = c.getDeclaredConstructor(String.class,int.class,String.class); 3 System.out.println(c1);
D:public T newInstance(Object... initargs) 注意:T表示的是泛型,Object... initargs表示的是你要实例化的指定参数
使用此 Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
也就是初始化对象
通过反射获取公共带参构造方法并使用:
1 //获取指定的构造方法,需要该方法的参数列表 2 Constructor c1 = c.getDeclaredConstructor(String.class,int.class,String.class); 3 System.out.println(c1); 4 5 // 通过带参构造方法对象创建对象 6 // public T newInstance(Object... initargs): 7 //有泛型,前面没使用泛型,先用Objcet 8 Object b = c1.newInstance("张三",13,"家乡"); 9 System.out.println(b); //Person [name=张三, age=13, address=家乡]
通过反射获取私有带参构造方法并使用:
1 //获取指定的私有构造方法 2 Constructor c1 = c.getDeclaredConstructor(String.class); 3 4 //public void setAccessible(boolean flag): 5 //flag的值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。 6 c1.setAccessible(true); 7 8 // public T newInstance(Object... initargs) 9 Object ob = c1.newInstance("张三"); 10 System.out.println(ob);
后两个代码,相当于以前的: 只不过通过反射,不需要导入对应的类
1 public Person(String name, int age, String address) 2 3 Person p = new Person("张三",13,"家乡"); 4 System.out.println(p);
和
1 private Person(String name){} 2 3 Person p = new Person("风清扬"); 4 System.out.println(p);
以上是关于java 27 - 3 反射之 通过反射获取构造方法并使用的主要内容,如果未能解决你的问题,请参考以下文章
java 27 - 8 反射之 通过反射来设置某个对象的某个属性为指定值