先来一段反射的概念:
在程序运行的时候动态装载类,查看类的信息,生成对象,或操作生成对象。
类在运行的时候,可以得到该类的信息,并且可以动态的修改这些信息
反射类的首要操作 - 获取类
获取类有 三种 方法:
假设类名为 Cat
(1)直接根据类名获取类
Class a = Cat.class;
(2)通过Class.forName 获取类,需要打全指定类的路径
Class a = Class.forName("org.xiaopan.test.Cat");
注意:
Class.forName 需要一个异常处理。不然编辑器无法通过。
(3)通过实例化的方式获取类
Class a = (new Cat()).getClass();
反射构造方法
吾有一类,曰:
class Cat{
//构造方法,形参为空
public Cat(){
System.out.println("Cat->nullCat");
}
//构造方法,形参为 一个String类型
public Cat(String a){
System.out.println("Cat->aCat,a=" + a);
}
//私有构造方法,形参为 一个String类型 和 一个Integer类型
private Cat(String a,Integer b){
System.out.println("Cat->abCat,a=" + a + "b=" + b.toString());
}
//构造方法,形参为 一个String数组类型 和 一个Map类型
public Cat(String[] aa,Map bb){
System.out.println("Cat->aabbCat");
System.out.println("aa=" + Arrays.toString(aa));
System.out.println("bb=" + bb);
}
}
无参构造方法调用
try{
//获取到类
Class a = Cat.class;
//通过反射获取到指定类下的构造方法
//要获取的构造方法为:
//public Cat()
//由于该构造方法无参数,所以我们传入一个 null 即可,也可以不传
Constructor constructor1 = a.getConstructor(null);
//实例化类
constructor1.newInstance(null);
}
catch (Exception e){
System.out.println(e);
}
输出:
注意:
getConstructor 需要加一个异常处理。
一个参数的构造方法调用
try{
//获取到类
Class a = Cat.class;
//通过反射获取到指定类下的构造方法
//要获取的构造方法为:
//public Cat(String a)
//由于该构造方法有一 String类型 参数
//在进行 getConstructor 反射时,就需要指定传参类型为 String.class
Constructor constructor1 = a.getConstructor(String.class);
//在实例化时,进行传参
constructor1.newInstance("testvalue");
}
catch (Exception e){
System.out.println(e);
}
输出:
多个参数的私有构造方法调用
注意,这里调用的构造方法是私有的哦~
try{
//获取到类
Class a = Class.forName("org.xiaopan.test.Cat");
//通过反射获取到指定类下的构造方法
//要获取的 私有 构造方法为:
//private Cat(String a,Integer b)
//
//由于是 私有 方法,获取私有方法的函数为 getDeclaredConstructor
//由于有两个参数,所以需要在 getDeclaredConstructor 传入对应的参数类型
Constructor c = a.getDeclaredConstructor(String.class, Integer.class);
//设置强制反射
c.setAccessible(true);
//构造函数实例化,并传参
//这里有个注意点,看下文的注意
c.