今天为了实现一个在调用的方法里面进行动态传参,于是狠狠的查了下反射机制(其实半年前用反射写过一个接口,现在又忘了)。
言归正传,今天只用到了Class.forName。
传入的参数是Class<?> clz,实现如下:
因为是同一个模块,所以先取到通用的包路径
PublisPublishModel.class.getPackage().getName();
Class.forName(packageName + "." + dataGrid.getTargetModel().获得类名的方法)
上面的参数里面字符串格式是"包路径" + "." + "类名" 。
就是这么两行代码,让我纠结了很久。
误区一:
dataGrid.getTargetModel().getClass(),因为我认为getTargetModel得到的是我要的参数,但是后面才发现搞错了,dataGrid.getTargetModel()只能得到TargetModel对象。
误区二:
(dataGrid.getTargetModel().获得类名的方法).class
这个是由于没明白Class。.class只能用在类型类上面,也就类似于A.class B.class
之后才找到了上面提到的那种方法,但是发现就算问题解决了,还没咋理解,于是又写了一个demo来验证自己对Class.forName的理解。
由于Class.forName是用于实例化对象的,因此写了一个类
Class dogClass = Class.forName("com.crx.entity.Dog");
System.out.println((Dog) dogClass.newInstance());
报错啦,错误信息java.lang.InstantiationException,是由于实例化异常。当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。造成的,但是我发现Dog类是一个普通的类,并不是抽象类或者接口,于是就一直在研究Dog这个类,根据在学校学的一些很基础的java知识,最后发现Dog,猜测可能是由于没有无惨构造方法。结果确实如果,一个类里面如果没有构造方法,默认会有一个构造方法,但是一旦写了有参构造方法,之前默认的无参构造就会被覆盖掉,所以就出现了这个问题了。
所以我需要补充点点下:
错误信息java.lang.InstantiationException,是由于实例化异常,当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口或者没有无参构造方法时,抛出该异常造成的。
写的比较乱,但是从这个,我感觉到java最最基础知识是多么的重要。