一、问题分析
反射机制 : 指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有属性和方法。
反射可以创建类的对象.
newInstance()方法
可以创建类的实例.那么拥有该方法除了Class类
之外,还有Constructor类
.
可是,Class类中的newInstance()方法只能创建默认构造器的对象,想要创建有参的构造函数还是要使用Constructor类中的newInstance(Object … initargs)方法.
那么如何获取Class类对象呢?如何获取Constructor类对象呢?
二、获取Class类对象
获取该类对象的方式有三种.对象.
- 对象.getClass()
- Class.forName(全限定类名);
- 类名.class
- 获取数组的Class类对象.
int[].class 或者 Class.forName("[I");
String数组获取方式还可以`Class.forName("[Ljava.lang.String;");
1.getClass()方法是Object类中的方法,Object类是所有类的父类,所有创建的对象都有该方法.
2.只要获取了类的全限定名,就可以通过Class.forName(String)
的形式来获取Class对象
3.类型.class
是一个Class类型的对象.且类型不一定是类,例如,int.
获取了Class类对象后,就可以直接调用newInstance()方法
来创建该类的对象.
Note : Class类中的newInstance()方法只能创建无参构造函数的对象.
三、获取Constructor类对象
先获取Class类对象后,可以调用getConstructor(Class<?>... parameterTypes)方法
和getDeclaredConstructor(Class<?>... parameterTypes)方法
这两个方法的区别是什么呢?getDeclaredConstructor()与getConstructor的区别
首先看getDeclaredConstructor(Class<?>… parameterTypes)
这个方法会返回指定参数类或接口的构造器,包括public的和非public的,当然也包括private的。
getDeclaredConstructors()的返回结果就没有参数类型的过滤了,返回类声明的所有构造函数的 Constructor对象的数组。
再来看getConstructor(Class<?>… parameterTypes)
这个方法返回的是上面那个方法返回结果的子集,只返回指定参数类型访问权限是public的构造器。
getConstructors()的返回结果同样也没有参数类型的过滤。返回类的所有公共构造函数。
知道两个方法的区别之后,就可以根据构造器的修饰符匹配调用哪个方法.(如果创建有参构造函数的对象时,需要在调用方法的参数依照构造器的类型顺序写上类型.class
)
调用该方法,将会返回Constructor类对象
,那么就可以调用newInstance(Object ... initargs)方法
,参数传入想要传入对应构造器相应类型的参数即可.创建完成.
对于getDeclaredConstructor(Class<?> ... parameterTypes)方法
可以访问私有构造器,因此对于私有构造器,仍然可以创建对象.但是在调用newInstance(Object ... initargs)方法
时,需要先将反射对象的accessible标志设置为true
.
四、实例演示
五、可能出现的问题
[报错信息] : java.lang.NoSuchMethodException: java.lang.Integer.< init >() - Java反射创建对象出现