阅读:6026回复:4
反射应用中的ClassLoader.loadClass和Class.forName的区别
(----------链接----------)
2.分析 Class.forName()和ClassLoader.loadClass
方法:Classloder. loadClass(String name, boolean resolve) 1:参数name代表类的全限定类名 2:参数resolve代表是否解析,resolve为true是解析该类 不进行链接意味着不进行包括初始化等一些列步骤,那么静态块和静态对象就不会得到执行。
其实该方法内部调用的是: Class.forName0(String name, boolean initialize, ClassLoader loader) 1.参数name代表全限定类名 2.参数initialize表示是否初始化该类,为true是初始化该类 3.参数loader 对应的类加载器 该方法默认需要初始化,一旦初始化,就会触发目标对象的 static块代码执行,static参数也也 会被再次初始化。 forName这句话就是装载类用的(new是根据加载到内存中的类创建一个实例,要分清楚)。 A a = (A)Class.forName("pacage.A").newInstance(); 这才是和 A a = new A();一样的效果。 3.数据库链接为什么使用Class.forName(className) JDBC Driver源码如下:使用Class.forName(className)才能在反射回去类的时候执行static块。
3.总结 在使用反射时,需要判断是否初始化目标,也就是说,是否需要执行其静态块和静态对象。 需要执行则使用Class.forName(className),不需要执行可以使用Classloder.loaderClass(String name) |
|