`
heshifk
  • 浏览: 10971 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于Class.forName的一点个人看法

阅读更多

今天为了实现一个在调用的方法里面进行动态传参,于是狠狠的查了下反射机制(其实半年前用反射写过一个接口,现在又忘了)。

言归正传,今天只用到了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最最基础知识是多么的重要。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics