微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

自定义文件系统类加载器

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:\Users\10853>d:

D:\>cd myjava

D:\myjava>javac -d . HelloWorld.java

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

D:\myjava>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐