快捷搜索:

扩展ClassLoader定制类装载器

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

Object obj = objClass.newInstance();

System.out.println(objClass.getName());

System.out.println(objClass.getClassLoader());

}

编译FileClassLoader

javac FileClassLoader.java然后运行java FileClassLoader 可以看到输出结果为

MyApp

FileClassLoader@1a5ab41

假如你把MyApp.class放入到你法度榜样的所在目录会呈现什么环境呢?读者自己实践一下吧!下面给出FileClassLoader的源代码。

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

public class FileClassLoader extends ClassLoader

{

public static final String drive = "d:/";

public static final String fileType = ".class";

public FileClassLoader() {

super();

}

public FileClassLoader(ClassLoader arg0) {

super(arg0);

}

public Class findClass(String name)

{

byte[] data = loadClassData(name);

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

}

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;

}

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

{

FileClassLoader loader = new FileClassLoader();

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

Object obj = objClass.newInstance();

System.out.println(objClass.getName());

System.out.println(objClass.getClassLoader());

}

}

您可能还会对下面的文章感兴趣: