java自定義類載入器
阿新 • • 發佈:2021-02-13
一、被載入的測試類
1.將被載入的測試類放到d盤test目錄下,然後其他子目錄按照測試的包名建立,完整路徑值這樣的:D:\test\com\example\jvm\demo
2.測試類如下:
package com.example.jvm.demo;
import java.io.PrintStream;
public class Hello
{
public void show()
{
System.out.println("hello");
}
}
二、自定義載入器
自定義類載入器,主要是重寫ClassLoader中的findClass方法;因為當所有的類載入器都載入不到class檔案時,就要呼叫findClass方法,而ClassLoader中的findClass方法是直接拋異常的,所以需要重寫findClass方法載入我們制定的檔案,程式碼如下:
protected Class<?> findClass(String name) throws ClassNotFoundException {
throw new ClassNotFoundException(name);
}
自定義的類載入器:
package com.example.jvm.demo; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.lang.reflect.Method; public class JVM_002_ClassLoader extends ClassLoader { @Override protected Class<?> findClass(String name) throws ClassNotFoundException { File file = new File("d:/test/"+name.replace(".","/").concat(".class")); ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { FileInputStream fis = new FileInputStream(file); int b = 0; while((b = fis.read()) != -1) { baos.write(b); } byte[] bytes = baos.toByteArray(); baos.close(); fis.close(); return defineClass(name,bytes,0,bytes.length); }catch (IOException e){ e.printStackTrace(); } return super.findClass(name); } public static void main(String[] args) throws Exception{ ClassLoader l = new JVM_002_ClassLoader(); Class<?> aClass = l.loadClass("com.example.jvm.demo.Hello"); Object o = aClass.newInstance(); Method method = aClass.getMethod("show"); method.invoke(o); } }
三、測試結果