您的位置:首页 > 编程语言 > Java开发

Java类加载器学习笔记

2018-04-17 15:36 197 查看

今后一段时间会全面读一下《深入理解Java虚拟机》

在这里先记一下在网上看到的几篇介绍 类加载器 的文章,等读到虚拟机类加载机制再详细介绍。

超详细Java中的ClassLoader详解

深入理解Java类加载器

 

贴一个自己写的类加载器。

Hello类。  把编译后的class文件放到别的路径下。

package ww;

public class Hello {

public void say() {
System.out.println("hello world");
}

}

WwClassLoader类。  继承ClassLoader类 重写 findClass()方法

package ww;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class WwClassLoader extends ClassLoader {

private String path; //路径
public WwClassLoader(String path) {
this.path = path;
}

@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
String fileName = parseFileName(name);
File file = new File(path,fileName);
try {
//读取class文件
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int lenth = 0;
while((lenth = fis.read()) != -1) {
baos.write(lenth);
}
byte[] buffer = baos.toByteArray();
baos.close();
fis.close();
//实例化class对象
return defineClass(name,buffer,0,buffer.length);
} catch (Exception e) {
e.printStackTrace();
}
return super.findClass(name);
}

//解析文件路径
private String parseFileName(String name) {
int index = name.lastIndexOf('.');
if(index == -1) {
return name+".class";
} else {
return name.substring(index+1)+".class";
}
}
}

WwTest类。   调用测试

package ww;

import java.lang.reflect.Method;

public class WwTest {
public static void main(String[] args) {
//我一直在找为什么自己定义的类的parent节点一定是AppClassLoader类的源码。要是知道的大佬可以告诉我一声
/*private static native void registerNatives();
static {
registerNatives();
}*/
WwClassLoader ww = new WwClassLoader("E://lib");
try {
Class hel = ww.findClass("ww.Hello");
//反射执行方法
if (hel != null) {
Object obj = hel.newInstance();
Method method = hel.getDeclaredMethod("say", null);
method.invoke(obj, null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: