通过反射获取对象的方式有很多,由于之前一直是用
Class clazs = Class.forName(类路径);
Object obj = Class.newInstance();
但是这个方法有很大的弊端,由于Class.newInstance()算是一个无参的构造函数,所以当你的类中没有无参的构造函数时,是无法调用这个方法的。所以今天就尝试了一下通过先获取构造函数的方式来创建对象。
通过查阅JDK文档,我们发现通过反射获取构造函数的方法有很多;
下面是我创建的两个类,注意是有错误的。
class BeInvoke{
BeInvoke(){
}
BeInvoke(int a,int b){
}
}
public class IIInvoke {
public static void main(String[] args) throws Exception {
Class clazs = Class.forName("day26.BeInvoke");
Object obj1 = clazs.getNestHost();
Constructor con1 = clazs.getConstructor();//报错的第19行
Object obj2 = con1.newInstance();
Constructor con2 = clazs.getConstructor(int.class,int.class);//由于20行还未编译到,暂时不报错
Object obj3 = con2.newInstance(1,2);
}
}
当我运行主函数的时候,一直报方法找不到的错误。
问题困扰了我老半天,很奇怪,明明有这个构造方法,而且直接通过类的字节码去调用这个方法对象创建实例对象是可以的,但是用字节码对象去获取构造函数却显示无法获取,查了半天资料,也没找到问题出在哪,后来还是决定从方法入手,再去仔细查看jdk文档的时候,发现这个。
也就是说通过这个方法反射得到的构造函数必须是公共的,也就是要加上public的。哈哈,原来如此,再给类的构造函数加上public修饰词以后,就能通过这个方法的到想要的结果了。