自定义实现简单的ClassLoader

来源:互联网 发布:js 判断html显示隐藏 编辑:程序博客网 时间:2024/05/21 22:32

参考:如何实现自定义的ClassLoader

http://blog.csdn.net/LongDick/archive/2007/11/09/1875644.aspx

 

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Method;


public class AutoClassLoader extends ClassLoader {

    //定义文件所在目录
    private static final String DEAFAULTDIR= "d://testclass//";
    //定义文件绝对路径
    private static String FILEPATH="";
   
    /*
    * 重写ClassLoader类的findClass方法,将一个字节数组转换为 Class 类的实例
    */
    public Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] b = null;
        try {
            b = loadClassData(AutoClassLoader.FormatClassName(name));
        } catch (Exception e) {
            e.printStackTrace();
        }

        //调用了DefineClass方法,目的在于把从文件中得到的二进制 数组转换为相应的Class实例。
        //DefineClass是一个Native的方法,它替我们识别Class文件格式,分析、读取相应的数据结构,并生成 一个Class实例。
        return defineClass(name, b, 0, b.length);

    }
    /*
    * 将指定路径的.class文件转换成字节数组
    */
    private byte[] loadClassData(String filepath) throws Exception {
        int n =0;
        BufferedInputStream br = new BufferedInputStream(
                        new FileInputStream(
                    new File(filepath)));
        ByteArrayOutputStream bos= new ByteArrayOutputStream();
            while((n=br.read())!=-1){
                bos.write(n);
            }
            br.close();
        return bos.toByteArray();
    }
   
    /*
    * 格式化文件所对应的路径
    */
    public static String FormatClassName(String name){
       
        FILEPATH= DEAFAULTDIR + name+".class";
        return FILEPATH;
    }
       
    /*
    * main方法测试
    */
    public static void main(String[] args) throws Exception {
       
        AutoClassLoader acl = new AutoClassLoader();
        Class c = acl.findClass("TestClass");
        Object obj = c.newInstance();
        Method m = c.getMethod("getName",new Class[]{String.class ,int.class});
        m.invoke(obj,"你好",123);
        System.out.println(c.getName());
        System.out.println(c.getClassLoader());
        System.out.println(c.getClassLoader().getParent());
    }
}

打印结果:

hello ~!你好@@123
TestClass
AutoClassLoader@757aef
sun.misc.Launcher$AppClassLoader@82ba41

============================================================================

public class TestClass {
   
    public void getName(String param,int i) {
       
              System.out.println(" hello ~!" + param +"@@"+ i);
             
             }

}

============================================================================

原创粉丝点击