分三个步骤:第一步写测试代码,第二步写读取class文件逻辑,第三部通过自定义类加载器获取测试代码输出结果
(1)编写测试代码
public class Robot {
static {
System.out.println("Robot class : hello world");
}
}
很简单的一个例子,在第三步中只要newInstance()就可以输出这句话.前提是要javac一下,生成class文件。
(2)编写读取class文件逻辑(自定义类加载器)
package com.interview.thread;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class MyClassLoader extends ClassLoader{
private String path;
private String classLoaderName;
public MyClassLoader(String path, String classLoaderName) {
this.path = path;
this.classLoaderName = classLoaderName;
}
//用于寻找类文件
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] b = loadClassData(name);
return defineClass(name,b, 0, b.length);
}
//用于加载类文件
private byte[] loadClassData(String name) {
name = path + name + ".class";
InputStream in = null;
ByteArrayOutputStream out = null;
try {
in = new FileInputStream(new File(name));
out = new ByteArrayOutputStream();
int len = 0;
while((len = in.read()) != -1) {
out.write(len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return out.toByteArray();
}
}
(3)通过自定义类加载器获取测试代码输出结果
package com.interview.thread;
public class MyClassLoaderTest {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
MyClassLoader classLoader = new MyClassLoader("C:\\Users\\80500\\Desktop\\", "myCustmerClassLoader");
Class loadClass = classLoader.loadClass("Robot");
loadClass.newInstance();
}
}