简体   繁体   English

显式加载-java.lang.ClassLoader

[英]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.

相关问题 谁加载java.lang.ClassLoader? - Who loads java.lang.ClassLoader? 如何实现java.lang.Classloader getResources()? - how to implement java.lang.Classloader getResources()? ApacheFOP-错误“在java.lang.ClassLoader $ 1 {urls = [],parent = null}中找不到org.apache.xerces.jaxp.SAXParserFactoryImpl”” - ApacheFOP - Error “org.apache.xerces.jaxp.SAXParserFactoryImpl not found in java.lang.ClassLoader$1{urls=[], parent=null}” EasyMock Java:不兼容的类型:java.lang.ClassLoader无法转换为java.lang.Class <capture#1 of ? extends > - EasyMock java: incompatible types: java.lang.ClassLoader cannot be converted to java.lang.Class<capture#1 of ? extends > Talend Open Studio - 错误(sun.misc.Unsafe.defineClass(java.lang.String,[B,int,int,java.lang.ClassLoader,java.security.ProtectionDomain)) - Talend Open Studio - an error (sun.misc.Unsafe.defineClass(java.lang.String,[B,int,int,java.lang.ClassLoader,java.security.ProtectionDomain)) 类加载器java.lang.NoClassDefFoundError? - Classloader java.lang.NoClassDefFoundError? 类加载器上的java.lang.ClassNotFoundException - java.lang.ClassNotFoundException on classloader 在Java 7中加载KeyStore会泄漏Classloader - Loading a KeyStore in Java 7 leaks the Classloader Java Classloader未加载xml文件 - Java Classloader not loading xml file 加载slf4j LoggerFactory时,websphere classloader给出java.lang.LinkageError - websphere classloader gives java.lang.LinkageError when loading slf4j LoggerFactory
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM