一、问题分析
反射机制 : 指的是程序在运行时能够获取自身的信息。在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)
这个方法返回的是上面那个方法返回结果的子集,
getConstructors()的返回结果同样也没有参数类型的过滤。返回类的所有公共构造函数。
只返回指定参数类型访问权限是public的构造器。
知道两个方法的区别之后,就可以根据构造器的修饰符匹配调用哪个方法.(如果创建有参构造函数的对象时,需要在调用方法的参数依照构造器的类型顺序写上
类型.class
)
调用该方法,将会返回
Constructor类对象
,那么就可以调用
newInstance(Object ... initargs)方法
,参数传入想要传入对应构造器相应类型的参数即可.创建完成.
四、实例演示
- Java反射 - [实例演示] 创建类的对象多种方式
- Java反射 - 创建数组实例