ClassLoader类加载器的用法

package com.liming.classloader;

import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class FileSystemClassLoader extends ClassLoader{
    private String rootDir;

    public FileSystemClassLoader(String rootDir) {
        this.rootDir = rootDir;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        Class<?> xlass = findLoadedClass(name);
        if (xlass != null) {
            return xlass;
        }else{

            try {
                xlass = getParent().loadClass(name);
                if (xlass != null) {
                    return xlass;
                }else{
                    return null;//此处传出null对象,表明没有加载到类
                }
            } catch (ClassNotFoundException e) {
                byte[] classData = loadClassData(name);
                if (classData == null) {
                    throw new ClassNotFoundException();
                }else {
                    xlass = defineClass(name, classData, 0, classData.length);
                    if (classData == null) {
                        throw new ClassNotFoundException();
                    } else {
                        return xlass;
                    }

                    //  e.printStackTrace();
                }
            }

        }



    }

    private byte[] loadClassData(String name){
        //need rootDir  name
        ByteArrayOutputStream baos=null;

        try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream((rootDir+name.replaceAll("\\.","/")+".class")));
        ) {
            baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024*8];
            int len;

            while ((len = bis.read(buffer,0,buffer.length))!=-1){
                baos.write(buffer,0,len);
            }
            baos.flush();

        }catch(IOException e){
            e.printStackTrace();
        }
        return baos.toByteArray();
    }



    public static void main1(String[] args) {
        System.out.println("HelloWorld");

        FileSystemClassLoader fscl = new FileSystemClassLoader("C:/");
        //同一个类被不同的加载器加载,JVM会认为是不相同的类

        System.out.println(fscl.getClass().getClassLoader());


        try {
            Class<?> xlass = fscl.findClass("com.liming.javassist.DT");
            Class<?> xlass2 = fscl.findClass("java.lang.String");

            System.out.println(xlass.getClassLoader());
            System.out.println(xlass2.getClassLoader());


            Object o = xlass.getConstructor(int.class,String.class).newInstance(888,"Fuck");
            Method m = xlass.getMethod("test5");

            System.out.println(m.invoke(o));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }


    }
    
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值