自定义类加载器代码

// 自定义的类加载器
class MyClassLoader2 extends ClassLoader {
    private String loaderName;  // 该类加载器的名字

    // 假设用户传进来一个com.fightzhong.test.Test的类, 此时将该类的名字转换为地址com/fightzhong..
    // 这样的形式, 然后拼接prefix和subfix从而得到该类的绝对地址, 同时prefix也表示类加载的路径
    private String prefix = "";    // 类加载器加载的class文件的前缀地址
    private String subfix = ".class";    // 类加载器加载的class文件的后缀名

    /*********传进来一个类加载器的名字和类加载器的双亲**************/
    public MyClassLoader2 (String loaderName, ClassLoader parent) {
        super(parent);
        this.loaderName = loaderName;
    }

    /*********传进来一个类加载器的名字**************/
    public MyClassLoader2 (String loaderName) {
        this.loaderName = loaderName;
    }

    /*********设置类加载器加载的文件的前缀地址**************/
    public void setPrefix (String prefix) {
        this.prefix = prefix;
    }

    /*********获取类加载器的名字**************/
    public String getLoaderName () {
        return loaderName;
    }

    /*********如果类加载器的双亲不能加载该类, 则调用本加载器的findClass方法来进行加载*******/
    @Override
    protected Class<?> findClass (String name) {
        // 获取类文件class文件的字节数组表现形式
        byte[] classData = loadClassData( name );
        // 调用native方法defineClass来进行Class对象的创建, 之后直接返回Class对象
        return defineClass( name, classData, 0, classData.length );
    }

    /*********将类文件转换为字节数组**************/
    private byte[] loadClassData (String name) {
        name = fixTheClassName( name );
        FileInputStream fileInputStream = null;
        ByteArrayOutputStream baos = null;
        byte[] classData = null;

        try {
            fileInputStream =  new FileInputStream( name );
            baos = new ByteArrayOutputStream();
            int len;
            while ( ( len = fileInputStream.read() ) != -1 ) {
                baos.write( len );
            }

            classData = baos.toByteArray();
        } catch ( Exception ex ) {
            ex.printStackTrace();
        }

        return classData;
    }

    /*
        将用户传进来的类的名字com.fightzhong.xxx.xx这样的转换为com/fightzhong/xxx/xxx, 并且拼接类
        加载器的前缀路径和文件后缀名, 从而得到一个完整的文件绝对地址
    */
    private String fixTheClassName (String name) {
        name = name.replace( ".", "/" );
        return prefix + name + subfix;
    }
}

results matching ""

    No results matching ""