动态加载类时,何时适合使用
Class.forName("SomeClass");
Run Code Online (Sandbox Code Playgroud)
我应该什么时候使用
ClassLoader.getSystemClassLoader().loadClass("SomeClass");
Run Code Online (Sandbox Code Playgroud)
或者,他们是两种做同样事情的方式吗?
命令是什么
Class.forName("oracle.jdbc.driver.OracleDriver")
Run Code Online (Sandbox Code Playgroud)
连接到Oracle数据库时确实做到了吗?是否有另一种做同样事情的方法?
AFAIK,java中提供了两种方法来从其名称初始化一个类.
类
public static Class forName(String className)抛出ClassNotFoundException
public static Class forName(String name,boolean initialize,ClassLoader loader)抛出ClassNotFoundException
ClassLoader:
public class loadClass(String name)throws ClassNotFoundException {return loadClass(name,false); }
已知的是在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)); …Run Code Online (Sandbox Code Playgroud)