java classloader

本文深入解析了Classloader的工作原理及其实现方式,包括类加载流程、委托模式的应用以及不同类型的Classloader之间的关系。同时,通过具体示例展示了如何使用自定义Classloader来加载类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

classloader 是负责载入类的对象。给出一个二进制的name,classloader就会根据name生产或载入组成一个类结构的数据。一种常见的策略是,把name转译成一个文件的名字,然后通过文件系统去读取这个类文件。

每个class 对象有一个getClassloader文法获得载入自己的class loader。数组对象不会由class loader载入,它会在运行时自动载入。对于数组元素是基本类型的,通过getClassloader返回的是null,其它自定义类型返回的时自定义对象的classloader

classloader使用委托模式搜索classes 和 resources。当需要调用一个class或resource时,class loader会首先靠自己去搜索它,如果没有找到,会在委托父class loader搜索。jvm 内建的class loader叫bootstrap class loader,它没有父class loader,它作为其它class loader的父class loader

测试:

package com.peaceful.jdk.demo;

import com.peaceful.common.util.Util;
import sun.reflect.Reflection;

import java.lang.ClassLoader;

/**
* Created by wangjun on 15/2/21.
*/
public class ClassLoaderTest {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Util.report(Reflection.getCallerClass());
        /** 载入ClassLoaderTest的classloader **/
        Util.report("载入ClassLoaderTest的classloader->" + ClassLoaderTest.class.getClassLoader());
        /** appache 提供的classloader */
        com.sun.org.apache.bcel.internal.util.ClassLoader classLoader = new com.sun.org.apache.bcel.internal.util.ClassLoader(java.lang.ClassLoader.getSystemClassLoader());
        Util.report("appache 提供的classloader->" + classLoader);
        Class ClassLoaderTestClass = Class.forName("com.peaceful.jdk.demo.ClassLoaderTest", false, classLoader);
        Util.report("classloader ? ->" + ClassLoaderTestClass.getClassLoader());
        Util.report("apache class loader parent ->" + ClassLoaderTestClass.getClassLoader().getParent());
        /** java.lang.ClassCastException: com.peaceful.jdk.demo.ClassLoaderTest cannot be cast to com.peaceful.jdk.demo.ClassLoaderTest **/
//        ClassLoaderTest ClassLoaderTest = (ClassLoaderTest) ClassLoaderTestClass.newInstance();
        /** 不同的classload 载入同一个类不能进行比较和转换 */
        Util.report("? ->" + ClassLoaderTestClass.isInstance(ClassLoaderTest.class));
        /** 通过指定classloader 载入指定类 **/
        classLoader.loadClass("com.peaceful.jdk.demo.ClassLoaderTest");
        /** 系统启动时设定的classloader **/
        Util.report(ClassLoader.getSystemClassLoader());

        int[] arr = {1, 2, 3, 4, 5};
        ClassLoaderTest[] arrClassLoaderTest = {};
        /**<p> <tt>Class</tt> objects for array classes are not created by class
        * loaders, but are created automatically as required by the Java runtime.
        * The class loader for an array class, as returned by {@link
        * Class#getClassLoader()} is the same as the class loader for its element
        * type; if the element type is a primitive type, then the array class has no
        * class loader.
        * */
        Util.report(arr.getClass().getClassLoader());
        Util.report(arrClassLoaderTest.getClass().getClassLoader());
        /** 父classloader **/
        Util.report(ClassLoaderTest.class.getClassLoader().getParent());
        /** 父classloader的classloader **/
        Util.report(ClassLoaderTest.class.getClassLoader().getParent().getParent());
        Util.report(T2.class.getClassLoader());
        Util.report(System.currentTimeMillis());
        Util.report(System.nanoTime());
    }

    /**
    * 输出结果
    *
    P_LOG: class com.intellij.rt.execution.application.AppMain
    P_LOG: 载入ClassLoaderTest的classloader->sun.misc.Launcher$AppClassLoader@3479404a
    P_LOG: appache 提供的classloader->com.sun.org.apache.bcel.internal.util.ClassLoader@486f8860
    P_LOG: classloader ? ->com.sun.org.apache.bcel.internal.util.ClassLoader@486f8860
    P_LOG: apache class loader parent ->sun.misc.Launcher$AppClassLoader@3479404a
    P_LOG: ? ->false
    P_LOG: sun.misc.Launcher$AppClassLoader@3479404a
    P_LOG: null
    P_LOG: sun.misc.Launcher$AppClassLoader@3479404a
    P_LOG: sun.misc.Launcher$ExtClassLoader@46bd530
    P_LOG: null
    P_LOG: sun.misc.Launcher$AppClassLoader@3479404a
    P_LOG: 1424681861529
    P_LOG: 1424681861530021000
    *
    */

    class T2 {

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值