黑马程序员技术交流社区
标题:
如何编写一个最简单的类加载器
[打印本页]
作者:
林国锋
时间:
2011-10-8 14:46
标题:
如何编写一个最简单的类加载器
在学习类加载器,请问如何编写一个最最简单的类加载器例子?
作者:
石宗银
时间:
2011-10-8 15:13
// 根类加载器,加载的核心类库
URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
for (URL u : urls) {
System.out.println(u);
}
// 扩展类 加载器,,加载的系统属性:java.ext.dirs 返回的路径下的 class
System.err.println("扩展类(extention classLoader)加载器"
+ ClassLoader.getSystemClassLoader().getParent());//非继承关系,只是意义上
System.out.println(System.getProperty("java.ext.dirs"));
// 应用(系统 application classLoader)类加载器,, 加载系统环境变量 PATH 或 CLASSPATH
// 指定的JAR包和类路径
System.err.println("应用(系统)类加载器" + ClassLoader.getSystemClassLoader());
// System.out.println(System.getenv("PATH"));
// System.out.println(System.getenv("CLASSPATH"));
复制代码
作者:
刘洋
时间:
2011-10-8 15:33
首先写一个自己的类加载器,MyClassLoader.java,继承ClassLoader类,然后重写findClass方法:
package com.wyp12.myClassLoader;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* 自己写一个类加载器 ,去加载"d:\myclass\com\wyp12\*.class"
*
* @author prince
*
*/
public class MyClassLoader extends ClassLoader {
private String name;
public MyClassLoader(String name) {
super(); // 通过这个构造方法生成的类加载器,它的父加载器是系统类加载器
this.name = name;
}
public MyClassLoader(String name, ClassLoader loader) {
super(loader); // 通过这个这个构造方法生成的类加载器,该加载器的父加载器是loader,如果为空,则父加载器为根加载器
// 子类继承父类,如果不显式写出调用父类的哪个构造方法,那么就默认调用父类的无参构造函数
this.name = name;
}
public String toString()
{
return this.name;
}
// 要重写findclass这个方法,loadclass会调用它
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// TODO Auto-generated method stub
byte[] data = null;
FileInputStream fis = null;
try {
fis = new FileInputStream("d:\\myclass\\com\\wyp12\\myClassLoader\\"+name+".class");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
ByteArrayOutputStream abos = new ByteArrayOutputStream();
int ch = 0;
try {
while (-1!=(ch=fis.read()))
{
abos.write(ch); //把字节一个一个写到输出流中
}
} catch (IOException e) {
e.printStackTrace();
}
data = abos.toByteArray(); //把输出流中的字节弄成一个字节数组
return this.defineClass("com.wyp12.myClassLoader."+name,data, 0, data.length,null);
}
}
复制代码
这个类加载器我让它默认加载d:\myclass\com\wyp12\myClassLoader路径下的class文件,具体文件名到时候我们构造实例的时候再给定,下面是测试类:
import com.wyp12.myClassLoader.MyClassLoader;
public class TestLoader {
public static void main(String[] args) throws Exception {
MyClassLoader l1 = new MyClassLoader("loader1");
Class dogC = l1.loadClass("Dog");
dogC.newInstance();
/*MyClassLoader l2 = new MyClassLoader("loader2",l1); //把L1作为它的父加载器
Class doccc = l2.loadClass("Dog");
doccc.newInstance(); */
}
}
复制代码
下面是要加载的类的源代码,很简答,就是让它打印出是谁加载了他
package com.wyp12.myClassLoader;
public class Dog {
public Dog()
{
System.out.println(this.getClass().getClassLoader());
}
}
复制代码
作者:
林国锋
时间:
2011-10-8 15:46
刘洋 发表于 2011-10-8 15:33
首先写一个自己的类加载器,MyClassLoader.java,继承ClassLoader类,然后重写findClass方法:这个类加载器 ...
谢谢!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2