类加载器

1.什么是类加载器?

Java类加载器(Java Classloader)是Java运行时环境(Java Runtime Environment)的一部分,负责动态加载Java类到Java虚拟机的内存空间中。


2.为什么要使用类加载器?

类通常是按需加载,即第一次使用该类时才加载。由于有了类加载器,Java运行时系统不需要知道文件与文件系统。

使用类加载器获取类对象,查看类对象的类加载器

代码测试:

@Test
    public void test1(){
        //通过类加载器获取对象
        try {
            
            //获取类对象
            Class clazz=Class.forName("com.zking.entity.Person");
            
            //获取类加载器
            ClassLoader classLoader=clazz.getClassLoader();
            ClassLoader classLoaderParent=classLoader.getParent();
            ClassLoader classLoaderGrandParent=classLoaderParent.getParent();
            
            //查询该类加载器的类型
            System.out.println(classLoader);
            System.out.println(classLoaderParent);
            System.out.println(classLoaderGrandParent);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


3.类加载器的类型:

《1》应用类加载器App:加载自己写的列或者jar包下面的类

《2》扩展类加载器Ext:加载jdk/jre/lib/ext/下面的所有jar包

《3》根类加载器null:加载jdk/jre/lib/jar(所有类加载器的父加载器)


4.自定义类加载器:

实体类代码

/**
 * 自定义类加载器
 * @author Administrator
 *
 */
public class ClassLoaderDIY extends ClassLoader{

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        System.out.println("自定义类加载器");
        System.out.println(name);
        //所有的.替换成\
        name=name.replaceAll("\\.", "/");
        System.out.println("替换后:"+name);
        //根据name找到桌面上 相对应的 person.class文件
        String desktopPath="C:\\Users\\Administrator\\Desktop\\"+name+".class";
        System.out.println(desktopPath);
        try {
            FileInputStream fis=new FileInputStream(desktopPath);
            System.out.println(fis.available());
            int len=0;
            byte[] b=new byte[fis.available()];
            len=fis.read(b);
            return defineClass(null,b,0,len);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
}


测试代码:

    @Test
    public void test3() throws InstantiationException, IllegalAccessException{
        //使用自己的类加载器 加载对象
        try {
            Class clazz=Class.forName("com.zking.entity.Person", true, new ClassLoaderDIY());
            System.out.println(clazz.newInstance());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值