JDK中提供了3种不同的类加载器:启动类装载器,扩展类装载器和系统类装载器。
引导类装载器,用于引导启动Java虚拟机,当执行一个JAVA程序时,就会启动引导类装载器,它是使用本地代码来实现的,会装载%JAVA_HOME%\\jre\lib\rt.jar,它是所有类装载器类的父装载器。扩展类装载器负责载入标准扩展目录中的类,其搜索路径是%JAVA_HOME%\jre\lib\ext,只需要将打包好的jar文件放入这个目录就可以了,给开发提供了很大的便利性。系统类装载器是默认的装载器,其搜索路径是classpath。
JVM到底使用的是哪一个类装载器,取决于类装载器的代理模式。每当需要装载一个类的时候,会首先调用系统类装载器,但是系统类装载器并不会立即装载,而是将其交给父装载器:扩展类装载器,扩展类装载器其将交给引导类装载器,引导类装载器没有父装载器,它会尝试装载这个类,如果找不到这个类,会交给扩展类装载器,如果扩展类装载器还是没有找到,会交给系统类装载器,如果系统类装载器还是没有找到这个类,则会抛出java.lang.ClassNotFoundException异常。代理模式主要是为了解决类装载的安全问题。例如:对于自定类的java.lang.Object类,永远得不到装载,除非,rt.jar中确实没有这个类。
public class TestClassLoader { public static void main(String[] args) { System.out.println(ClassLoader.getSystemClassLoader()); System.out.println(ClassLoader.getSystemClassLoader().getParent()); System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent()); } }
结果:
sun.misc.Launcher$AppClassLoader@19fc4e sun.misc.Launcher$ExtClassLoader@2a0364ef null
。。
相关推荐
`ClassLoaderTest`是一个特定的测试用例,专注于如何有效地管理和关闭类加载器,以防止资源泄漏,特别是针对加载了基础jar文件的情况。当我们使用自定义的URLClassLoader时,尤其需要注意类加载器的生命周期管理,...
- `ClassLoaderTest`类中的构造方法`publicClassLoaderTest(){ System.out.println("执行构造方法ClassLoaderTest()"); }`会在每次通过`newClassLoaderTest();`创建新对象时调用。 通过上述分析,我们可以清楚地...
public class ClassLoaderTest { public static void main(String[] args) throws Exception { ClassLoader myLoader = new ClassLoader() { // 创建自定义类加载器 @Override public Class<?> loadClass(String...
public class ClassLoaderTest { public static void main(String[] args) throws ClassNotFoundException { ClassLoader cl = ClassLoader.getSystemClassLoader(); //下面语句仅仅是加载Tester类 cl....
当执行这个命令时,会观察到JRE的Java Runtime Environment如何加载`ClassLoaderTest`类,然后加载`TestClassA`类的过程。 ##### 示例2:显式加载过程 ```java public class CLTest { public static void main...
ClassLoader loader = ClassLoaderTest1.class.getClassLoader(); System.out.println("ThisClass is loaded by: " + loader); System.out.println("AppClassLoader's father classLoader is: " + loader....
在"ClassLoaderTest"这个文件中,可能包含了实现自定义类加载器的代码示例。 创建自定义类加载器通常需要继承`java.lang.ClassLoader`类,并重写`findClass()`方法。这个方法应该返回一个`Class`对象,表示已加载的...
在给定的`ClassloaderTest`文件中,可能包含了一个示例代码,用于演示如何创建和使用一个简单的网络类加载器。通过分析和学习这段代码,你可以更深入地理解类加载器的工作原理以及如何自定义类加载器来实现特定需求...
public class ClassLoaderTest { public static void main(String[] args) { MyClass obj = new MyClass(); System.out.println(obj.getClass().getClassLoader()); } } ``` 其中,`MyClass`位于不同路径时...
public class ClassLoaderTest { @Test public void test() throws Exception { Class.forName("com.jinggujin.classloader.Bean"); } } ``` 运行此测试,你会看到控制台输出"static code block.",证明静态...
在上述代码示例中,我们看到了如何通过`ClassLoaderTest.class.getClassLoader()`来获取当前类的类加载器。对于`ClassLoaderTest`这样的用户自定义类,它通常是由AppClassLoader加载的。而像`System`或`ArrayList`...
在`ClassLoaderTest`类中,我们可以看到如何获取和打印类加载器的层次结构。`getBootstrapClassPath().getURLs()`可以列出引导类加载器加载的类库路径。`ClassLoader`提供的`loadClass()`, `findClass()`, `...