定义一个Test类,代码如下,编译之后放到C:/Users/88440/Desktop目录下。
public class Test {
public void comeOn(){
System.out.println("come On");
}
}
定义一个TestClassLoader类继承ClassLoader类作为自定义类加载器
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
public class TestClassLoader extends ClassLoader {
private static String rootDir="C:/Users/88440/Desktop";//文件的根路径
// 被自定义加载器加载的类名
private static String testClassName = "Test";
@Override
public Class<?> findClass(String name) throws ClassNotFoundException {
// 只处理Test类
if (name.equals(testClassName)) {
// 调用JVM的native方法定义Test类
return defineClass(testClassName, getClassData("Test"), 0, getClassData("Test").length);
}
return super.findClass(name);
}
public static void main(String[] args) {
// 创建自定义的类加载器
TestClassLoader loader = new TestClassLoader();
try {
// 使用自定义的类加载器加载TestHelloWorld类
Class testClass = loader.loadClass(testClassName);
// 反射创建Test类,等价于 Test t = new Test();
Object testInstance = testClass.newInstance();
// 反射获取comeOn方法
Method method = testInstance.getClass().getMethod("comeOn");
// 反射调用hello方法,等价于 String str = t.comeOn();
String str = (String) method.invoke(testInstance);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* @param name
* @return 返回所加载类class文件的字节数组
*/
private byte[] getClassData(String name){
String path = rootDir+"/"+name.replace(".", "/")+".class";
InputStream is = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
is = new FileInputStream(path);
byte[] buffer = new byte[1024];
int d = 0;
while((d=is.read(buffer))!=-1){
baos.write(buffer, 0, d);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return baos.toByteArray();
}
}
运行TestClassLoader.java后效果如下图所示