今天为了实现一个在调用的方法里面进行动态传参,于是狠狠的查了下反射机制(其实半年前用反射写过一个接口,现在又忘了)。
言归正传,今天只用到了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最最基础知识是多么的重要。
相关推荐
Class.forName(xxx.xx.xx) 返回的是一个类 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段
NULL 博文链接:https://listen-raining.iteye.com/blog/1894456
class.forname的作用.doc 详细解析抽象类和接口的区别.doc
Class.forName(xxx.xx.xx) 返回的是一个类,但Class.forName方法的作用到底...下面这篇文章就来给大家详细介绍了关于java中Class.forName方法的作用,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
NULL 博文链接:https://wuaner.iteye.com/blog/1009134
对SPI,理论联系实际的理解
在Java的反射中,Class.forName和ClassLoader的区别共4页.pdf.zip
并且只有调用了newInstance()方法采用调用构造函数,创建类的对象看下Class.forName()源码//Class.forName(String c
介绍了java中Class.forName的作用,有需要的朋友可以参考一下
主要介绍了使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")的相关知识,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
Java中 Class.forName()_newInstance()_New_三者区别。
主要介绍了jdbc中class.forname的作用,使用示例说明了他作用及使用方法,大家参考使用吧
如果熟悉使用JDBC来连接数据库的同学一定很清楚连接数据库的代码中一定会有依据Class.forName (com.mysql.jdbc.Driver); public static Connection getConnection() throws ClassNotFoundException, SQLException ...
主要介绍了Java Class.forName()用法和newInstance()方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
下面小编就为大家带来一篇浅谈java中类名.class, class.forName(), getClass()的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
java连接各种数据库的驱动 jar包 orale: Class.forName("oracle.jdbc.driver.OracleDriver"); mysql:Class.forName("com.mysql.jdbc.Driver"); access:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); sqlsever:...
Class.forName("org.gjt.mm.mysql.Driver").newInstance(); //或者Class.forName("com.mysql.jdbc.Driver"); String url ="jdbc:mysql://localhost/myDB? user=soft&password=soft1234&useUnicode=true&...
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; //mydb为数据库 String user="sa"; String password=...
SoapDiscovery.class.php