您的位置:首页 > 其它

自定义实现简单的ClassLoader

2015-10-04 23:15 330 查看
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="";

   

   

    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);

    }

   

    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;

    }

   
   

   

    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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: