加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java JVM-自定义类加载器从零到有

发布时间:2020-12-15 07:43:00 所属栏目:Java 来源:网络整理
导读:自定义文件系统类加载器 public class Loader extends ClassLoader{ private String dir; public Loader(String dir) { this.dir=dir; } @Override protected Class? findClass(String name)throws ClassNotFoundException { Class? c=findLoadedClass(name)
自定义文件系统类加载器

public class Loader extends ClassLoader{
    private String dir;
    public Loader(String dir)
    {
        this.dir=dir;
    }
    @Override
    protected Class<?> findClass(String name)throws ClassNotFoundException
    {
        Class<?> c=findLoadedClass(name);

    if(null!=c)
    {
        return c;
    }else
    {
        ClassLoader parent=this.getParent();
        try {
        c=parent.loadClass(name);
        }catch(Exception e)
        {
            //e.printStackTrace();
        }
        if(c!=null)
        {
            return c;
        }else
        {
            byte[] data=getData(name);

            if(data==null)
            {
                throw new ClassNotFoundException();
            }else
            {
                c=defineClass(name,data,data.length);
                System.out.println("yes");
            }
        }
    }
    return c;
}

private byte[] getData(String classname)
{
    String path=dir+"/"+classname.replace(‘.‘,‘/‘)+".class";

    InputStream is=null;
    ByteArrayOutputStream bos=new ByteArrayOutputStream();
    try {
        is=new FileInputStream(path);
        int len=-1;
        byte[] buffer=new byte[1024];
        while((len=is.read(buffer))!=-1)
        {
            bos.write(buffer,len);
        }
        bos.flush();
        return bos.toByteArray();
    }catch(IOException e)
    {
        e.printStackTrace();
        return null;
    }finally {
        try {
            if(null!=is)
            {
                is.close();
            }
        }catch(IOException e)
        {
            e.printStackTrace();
        }
        try {
            if(null!=bos)
            {
                bos.close();
            }
        }catch(IOException e)
        {
            e.printStackTrace();
        }
    }

}
}

javassist 创建java文件,然后使用自定义类加载器加载

public class One {

public static void main(String[] args) throws Exception {

    ClassPool pool=ClassPool.getDefault();
    CtClass cc=pool.makeClass("com.sxt.in.HelloWorld");

    CtMethod m=CtMethod.make("public static void main(String[] args){System.out.println("aa");}",cc);
    cc.addMethod(m);

    cc.writeFile("d:/myjava");

    Loader loader =new Loader("d:/myjava");
    Class<?> c=loader.loadClass("com.sxt.in.HelloWorld");

    System.out.println(c.getClassLoader());

 }
}

cmd编译创建的java文件:

C:Users10853>d:

D:&;cd myjava

D:myjava>javac -d . HelloWorld.java

D:myjava>java com.sxt.in.HelloWorld
aa

D:myjava>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读