自定义加载器问题
2011-12-19 23:38
253 查看
mport java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class MyClassLoader extends ClassLoader{
private String name;//类加载器的名字
private String path = "F:\\";//加载类的路径
private static final String fileType = ".class";//文件的扩展名
public MyClassLoader(String name){
super();//显式地调用父类构造器,将该加载器的父加载器设置为默认的系统加载器
this.name = name;
}
public MyClassLoader(ClassLoader parent,String name){
super(parent);//设置该加载器的父加载器
this.name = name;
}
//将java文件中的数据存储到字节数组中
private byte[] loadClassData(String name){
byte[] data = null;//存储字节码
InputStream ips = null;
ByteArrayOutputStream baos = null;
try{
String cname = name.replace(".", "\\");//获取正确的路径格式
ips = new FileInputStream(new File(path+cname+fileType));
baos = new ByteArrayOutputStream();
int ch = 0;
while(-1 != (ch = ips.read()) ){
baos.write(ch);//从文件输入流中读取数据,将读到的数据写到字节数组输出流中
}
data = baos.toByteArray(); //将输出流中的中的数据存入到字节数组data中。
ips.close();
baos.close();//关闭输入输出流
}catch(Exception ep){
ep.printStackTrace();
}
return data;
}
//获取Class对象 ,在通过父类加载器检查所请求的类后,此方法将 loadClass 方法调用。
public Class<?> findClass(String name) throws ClassNotFoundException
//自己定义的加载器覆盖父类的findClass方法。是为了将.class 文件的数据转换成字节码。
{
byte[] data = this.loadClassData(name); // 获得2进制数据。
return this.defineClass(name, data, 0, data.length); //将上述的2进制数据变成class 字节码。
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String toString(){
return this.name;
}
//测试方法
public static void test(ClassLoader loader) throws Exception{
Class<?> c = loader.loadClass("First");
c.newInstance();
}
public static void main(String[] args) throws Exception {
MyClassLoader loader1 = new MyClassLoader("loader1"); //创建自己的类加载器名叫loader1
loader1.setPath("F:\\myapp\\loader1\\");
MyClassLoader loader2 = new MyClassLoader(loader1,"loader2");
loader2.setPath("F:\\myapp\\loader2\\");
test(loader2); //此时 如果F:\\myapp\\loader1\\ 下有First 就不会报错 如果 没有就会报错,而不会有loader2加载 这是为什么 谁能告诉我呢
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class MyClassLoader extends ClassLoader{
private String name;//类加载器的名字
private String path = "F:\\";//加载类的路径
private static final String fileType = ".class";//文件的扩展名
public MyClassLoader(String name){
super();//显式地调用父类构造器,将该加载器的父加载器设置为默认的系统加载器
this.name = name;
}
public MyClassLoader(ClassLoader parent,String name){
super(parent);//设置该加载器的父加载器
this.name = name;
}
//将java文件中的数据存储到字节数组中
private byte[] loadClassData(String name){
byte[] data = null;//存储字节码
InputStream ips = null;
ByteArrayOutputStream baos = null;
try{
String cname = name.replace(".", "\\");//获取正确的路径格式
ips = new FileInputStream(new File(path+cname+fileType));
baos = new ByteArrayOutputStream();
int ch = 0;
while(-1 != (ch = ips.read()) ){
baos.write(ch);//从文件输入流中读取数据,将读到的数据写到字节数组输出流中
}
data = baos.toByteArray(); //将输出流中的中的数据存入到字节数组data中。
ips.close();
baos.close();//关闭输入输出流
}catch(Exception ep){
ep.printStackTrace();
}
return data;
}
//获取Class对象 ,在通过父类加载器检查所请求的类后,此方法将 loadClass 方法调用。
public Class<?> findClass(String name) throws ClassNotFoundException
//自己定义的加载器覆盖父类的findClass方法。是为了将.class 文件的数据转换成字节码。
{
byte[] data = this.loadClassData(name); // 获得2进制数据。
return this.defineClass(name, data, 0, data.length); //将上述的2进制数据变成class 字节码。
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String toString(){
return this.name;
}
//测试方法
public static void test(ClassLoader loader) throws Exception{
Class<?> c = loader.loadClass("First");
c.newInstance();
}
public static void main(String[] args) throws Exception {
MyClassLoader loader1 = new MyClassLoader("loader1"); //创建自己的类加载器名叫loader1
loader1.setPath("F:\\myapp\\loader1\\");
MyClassLoader loader2 = new MyClassLoader(loader1,"loader2");
loader2.setPath("F:\\myapp\\loader2\\");
test(loader2); //此时 如果F:\\myapp\\loader1\\ 下有First 就不会报错 如果 没有就会报错,而不会有loader2加载 这是为什么 谁能告诉我呢
}
}
相关文章推荐
- mysql 自定义方法创建 问题总结
- 自定义Drawable,点击效果出不来的问题
- struts中自定义标签引入到jsp中报错问题,不能引入问题
- Java中JDK中path和classpath的设置相关问题(关于import自定义包和jar的问题)
- 飞思卡尔MCU自定义中断向量的相关问题 bootloader程序过程中的问题
- 茗洋Easy UI 1.3.5 部分问题解决系列专题[自定义alert关闭时间,自动关]
- [求助]关于在状态栏显示自定义坐标系下鼠标指针所在位置坐标的问题
- 自定义seekbar中,圆球显示不全被覆盖掉一部分问题
- 关于html标签自定义属性的问题
- hadoop自定义类型注意问题
- wf工作流 请求的性能计数器不是自定义计数器,它必须初始化为 ReadOnly 问题处理
- 解决vs2005,ASP.NET2.0自定义命名空间问题!
- 自定义项目中各自定义模块引用问题的解决方法
- 关于PHP自定义扩展加载的问题
- TP5的扩展引用自定义函数的相关问题
- Classloader 二 自定义类加载器
- 自定义标题,键盘弹出之后,标题栏被顶出问题处理
- 自定义TextView显示偏移问题
- 关于微信服务号自定义发送给朋友/分享到朋友圈, 发送/分享失败的一些问题及解决方式
- 添加自定义监控项目,配置邮件告警,测试告警,不发邮件的问题处理