【发布时间】:2011-07-10 03:18:57
【问题描述】:
可能重复:
Difference betweeen Loading a class using ClassLoader and Class.forName
AFAIK,java 中提供了两种从类名初始化类的方法。
类
公共静态类 forName(String 类名)抛出 ClassNotFoundException
公共静态类 forName(String 名称,布尔初始化,类加载器 loader) 抛出 ClassNotFoundException
-
类加载器:
公共类加载类(字符串 名称)抛出 ClassNotFoundException { 返回负载类(名称,假); }
已知的东西在forName方法中,我们可以指定initialize的标志为false,这样会跳过一些静态的东西来为这个类初始化。但还有什么? 我应该如何正确使用它们?
最好能举出一些好的例子。
谢谢!
更新:
提出问题后,我做了一些简单的classLoader测试。
ClassLoader cls = ClassLoader.getSystemClassLoader();
Class someClass = cls.loadClass("Test");
Class someClass0= Class.forName("Test");
Class someClass1= Class.forName("Test",false,cls);
URL[] urls = new URL[] {new File("bin/").toURL()};
ClassLoader cls2 = new URLClassLoader(urls, null);
Class someClass2 = cls2.loadClass("Test");
ClassLoader cls3 = new URLClassLoader(urls, cls);
Class someClass3 = cls3.loadClass("Test");
System.out.println(someClass.equals(someClass0));
System.out.println(someClass.equals(someClass1));
System.out.println(someClass.equals(someClass2));
System.out.println(someClass.equals(someClass3));
结果是
真,真,假,真
更新
这是我对
Difference between loadClass(String name) and loadClass(String name, boolean resolve)
【问题讨论】:
-
@Bohemian 我已经阅读了链接,我没有看到任何人强调 Class.forName 将初始化静态事物包括静态块和静态变量的区别。另外这两个方法实际上最终调用了不同的本地方法,private native void esolveClass0(Class c); private static native Class forName0(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException;会造成差异吗?
标签: java classloader