自定义实现简单的ClassLoader

来源:互联网 发布:淘宝店铺详情页在哪里 编辑:程序博客网 时间:2024/05/16 05:51

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


public class AutoClassLoader extends ClassLoader {

   //定义文件所在目录
    privatestatic final String DEAFAULTDIR= "d://testclass//";
   //定义文件绝对路径
    privatestatic String FILEPATH="";
   
   
    publicClass<?> 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);

    }
   
    privatebyte[] loadClassData(String filepath) throws Exception {
       int n=0;
      BufferedInputStream br = new BufferedInputStream(
                   newFileInputStream(
                newFile(filepath)));
      ByteArrayOutputStream bos= new ByteArrayOutputStream();
         while((n=br.read())!=-1){
            bos.write(n);
          }
         br.close();
       returnbos.toByteArray();
    }
   
   
    publicstatic String FormatClassName(String name){
      
       FILEPATH=DEAFAULTDIR + name+".class";
       returnFILEPATH;
    }
      
   
    publicstatic 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 voidgetName(String param,int i) {
      
           System.out.println(" hello ~!" + param +"@@"+ i);
           
          }

}

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

0 0
原创粉丝点击