扩展ClassLoader定制类装载器
来源:互联网 发布:哪个软件调用rundll32 编辑:程序博客网 时间:2024/06/06 06:49
本文将讲述如何扩展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());
}
}
- 扩展ClassLoader定制类装载器
- 类装载器ClassLoader
- Java类装载器 ClassLoader
- JAVA的类装载器(ClassLoader)
- JAVA的类装载器(ClassLoader)
- JAVA的类装载器(ClassLoader)
- ClassLoader——类装载器
- 类装载器ClassLoader的工作机制
- 深入剖析JVM ------ 类装载器ClassLoader
- 类装载器ClassLoader工作机制
- Java中的类装载器(ClassLoader)
- 使用ClassLoader类装载器获取系统资源
- 类装载器——ClassLoader
- JVM装载类(ClassLoader)
- 关于jdk中类装载器ClassLoader扩展和JNI技术(JavaNativeInterface)以及类文件的加密解密算法
- JAVA类装载器classloader和命名空间namespace
- JAVA类装载器classloader和命名空间namespace
- java 虚拟机类装载器(classloader)的工作机制
- 如何用VisualC++6.0创建一个数据库和表
- SQL高手篇:精妙SQL语句介绍
- 刚做的一个网页计数器 大家参考一下
- 自己做的觉得好玩的第一个JAVA程序
- CSDN的气氛还是怪怪的
- 扩展ClassLoader定制类装载器
- 正确使用String类的几点注意
- J2SE 5.0新特性之static import
- 使用Proguard混淆J2ME应用程序
- WEB打印大全(http://www.pcsky.cn/article/list.asp?id=797)
- J2ME游戏开发中使用层的概念
- ANT学习笔记
- J2ME基础笔记
- 龟爬的速……