[英]Explicit loading - java.lang.ClassLoader
In first case, For explicit loading of test.ClassLoaderTest
using below code, 在第一种情况下,要使用以下代码显式加载
test.ClassLoaderTest
,
public ClassLoaderTest{
public static void main(String[] args){
.....
Class.forName("test.ClassLoaderTest", true,
ClassLoaderTest.class.getClassLoader().getParent());
....
}
findClass()
method of Launcher$ExtClassLoader
instance gets invoked to load test.ClassLoaderTest
with below error due to visibility principle, 由于可见性原理,将调用
Launcher$ExtClassLoader
实例的findClass()
方法来加载test.ClassLoaderTest
并出现以下错误,
java.lang.ClassNotFoundException: test.ClassLoaderTest
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at sun.misc.Launcher$ExtClassLoader.findClass(Launcher.java:229)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at test.ClassLoaderTest.main(ClassLoaderTest.java:29)
In second case, On explicit loading of test.ClassLoaderTest1
, using 在第二种情况下,在显式加载
test.ClassLoaderTest1
,使用
public ClassLoaderTest{
public static void main(String[] args){
.....
Class.forName("test.ClassLoaderTest1");
....
}
loadClass()
method of Launcher$AppClassLoader
instance is ultimately used to load test.ClassLoaderTest1
class, Launcher$AppClassLoader
实例的loadClass()
方法最终用于加载test.ClassLoaderTest1
类,
where test.ClassLoaderTest1
is a wrong class file that lead to below error, 其中
test.ClassLoaderTest1
是错误的类文件,导致以下错误,
java.lang.ClassNotFoundException: test.ClassLoaderTest1
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at test.ClassLoaderTest1.main(ClassLoaderTest.java:16)
In both cases, class loading job is done by java.net.URLClassLoader.findClass()
在这两种情况下,类加载工作均由
java.net.URLClassLoader.findClass()
Class.forName()
internally invokes getClassLoader()
to know the class loader that already loaded the class. Class.forName()
内部调用getClassLoader()
来知道已经加载了该类的类加载器。
In second case, When Class
gets a class loader instance(of type Launcher$AppClassLoader) by calling ClassLoader cl = getClassLoader0();
在第二种情况下,当
Class
通过调用ClassLoader cl = getClassLoader0();
获得类加载器实例(Launcher $ AppClassLoader类型ClassLoader cl = getClassLoader0();
to invoke the class loader instance again. 再次调用类加载器实例。
Is java.lang.ClassLoader
mainly used for sub-classing custom class loader? java.lang.ClassLoader
主要用于子类化自定义类加载器吗? that load classes not available in CLASSPATH but from network source etc... 加载的类不是CLASSPATH中可用的,而是来自网络源等的。
From the Javadoc, 在Javadoc中,
public **abstract** class ClassLoader
extends Object
There are different ClassLoader implementations that use different strategies for locating and reading the byte streams that compose a class. 有不同的ClassLoader实现,它们使用不同的策略来定位和读取组成类的字节流。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.