可能重复的区别:
Difference betweeen Loading a class using ClassLoader and Class.forName什么ClassLoader.load(名称)和的Class.forName(名称)
据我所知,在的Java提供了两种方法来初始化一个名字的类。
类
公共静态类的forName(字符串 的className)抛出 ClassNotFoundException的
公共静态类的forName(字符串 名,布尔初始化,类加载器 装载机)抛出的ClassNotFoundException
的ClassLoader:
公共类的loadClass(字符串 名)抛出的ClassNotFoundException { 回报的loadClass(姓名,假); }
已知的是在的forName方法,我们可以指定初始化的标志是假,这将跳过某些该类被初始化静态的东西。但是还有什么? 我应该如何正确使用它们?
最好你可以展示一些很好的例子。
谢谢!
UPDATE:
提出的问题后,我做了一些简单的类加载器的测试。
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));
结果是
真,真,假,真
UPDATE
这是我约
Difference between loadClass(String name) and loadClass(String name, boolean resolve)
@Bohemian我已阅读的链接,我没有看到任何人强调说的Class.forName将初始化静态的东西还包括静态块和静态变量的区别。另外这两个方法实际上终于调用了不同的本地方法,private native void esolveClass0(Class c);私有静态本地Class forName0(字符串名称,布尔初始化,ClassLoader加载器)抛出ClassNotFoundException;它会导致差异吗? –