page contents

如何自定义一个 ClassLoader?

Pack 发布于 2020-02-05 10:07
阅读 435
收藏 0

如何自定义一个 ClassLoader?

  • 步骤是什么?
  • 它的作用是什么?
255
Pack
Pack

你可以先看官网文档,文档有案例。然后根据你的实际去应用就可以了。网上也很多。


自定义类加载器分为以下几个步骤:


1、定义类。继承ClassLoader


2、重写ClassLoader的 findClass方法

就是这么简单,下面是我自己写的自定义类加载器例子

 

public class MyClassLoader extends ClassLoader{

 

    private String path;   //类的加载路径

    private String name;   //类加载器的名字

 

    public MyClassLoader() {}

    public MyClassLoader(String path,String name){

        this.path = path;

        this.name = name;

    }

 

 

    //用于寻找类文件

    public Class findClass(String name) {

        byte[] b = loadClassData(name);

        return defineClass(name, b, 0, b.length);

    }

 

    //用于加载类文件

    private byte[] loadClassData(String name) {

 

        name = path + name + ".class";    

        //使用输入流读取类文件

        InputStream in = null;

        //使用byteArrayOutputStream保存类文件。然后转化为byte数组

        ByteArrayOutputStream out = null;

        try {

            in = new FileInputStream(new File(name));

            out = new ByteArrayOutputStream();

            int i = 0;

            while ( (i = in.read()) != -1){

                out.write(i);

            }

 

        }catch (Exception e){}

        finally {

            try {

                out.close();

                in.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

 

        }

 

        return out.toByteArray();

 

    }

 

    public String getName() {

        return name;

    }

 

    public void setPath(String path) {

        this.path = path;

    }

}

  然后调用


 

public static void main(String[] args) {

        MyClassLoader m = new MyClassLoader("/home/fanjie/code/","classLoad1");

 

        Class c = m.findClass("Hello");

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

 

    }

请先 登录 后评论