扩展ClassLoader定制类装载器

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

Java的ClassLoader与Package机制介绍了ClassLoader的委派机制,它是把装载的任务传递给上级的装载器的,依次类推,直到启动类装载器(没有上级类装载器)。假如启动类装载器能够装载这个类,那么它会首先装载。假如不能,则往下传递。其实这引出一个运行时包的概念。不同装载器装载的类,即使包名相同也不能互相访问。这样保证了核心类库不被破坏。

本文将讲述如何扩展ClassLoader类实现一个自己的类装载器,每个Class对象都有一个引用指向装载他的ClassLoader,你可以通过public ClassLoader getClassLoader()方法得到它。为了创建自己的类装载器我们应该扩展ClassLoader类,这是一个抽象类。我们目的是从本地文件系统使用我们实现的类装载器装载一个类。我们创建一个FileClassLoader extends ClassLoader。我们需要覆盖ClassLoader中的

findClass(String name)方法,这个方法通过类的名字而得到一个Class对象。

public Class findClass(String name)

{

byte[] data = loadClassData(name);

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

}

我们还应该提供一个方法loadClassData(String name),通过类的名称返回class文件的字节数组。然后使用ClassLoader提供的defineClass()方法我们就可以返回Class对象了。

public byte[] loadClassData(String name)

{

FileInputStream fis = null;

byte[] data = null;

try

{

fis = new FileInputStream(new File(drive + name + fileType));

ByteArrayOutputStream baos = new ByteArrayOutputStream();

int ch = 0;

while ((ch = fis.read()) != -1)

{

baos.write(ch);

}

data = baos.toByteArray();

} catch (IOException e)

{

e.printStackTrace();

}

return data;

}

这里我们是从D盘装载一个类。

下面我们提供一个类public class MyApp{},类中没有定义任何方法和变量,下面我们编译MyApp.java得到MyApp.class,然后把文件放在D盘的根目录。为了证实MyApp.class是被我们定义的classloader装载的,我们在FileClassLoader的main()方法中打印出装载MyApp.class的类装载器的名称。

public static void main(String[] args) throws Exception

{

FileClassLoader loader = new FileClassLoader();

Class objClass = loader.loadClass("MyApp", true);

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航