假如我們的類不在classpath下,而我們又想讀取一個自定義的目錄下的class,如果做呢?
讀取自定義目錄的類
示例讀取c:/test/com/test.jdk/Key.class這個類。
package com.test.jdk;
public class Key {
private String key = "111111";
}
自定義ClassLoader
import org.apache.commons.io.IOUtils;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class LocalClassLoader extends ClassLoader {
private String path = "c:/test/";
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class<?> cls = findLoadedClass(name);
if (cls != null) {
return cls;
}
if (!name.endsWith(".Key")) {
return super.loadClass(name);
}
try {
InputStream is = new FileInputStream(path + name.replace(".", "/") + ".class");
byte[] bytes = IOUtils.toByteArray(is);
return defineClass(name, bytes, 0, bytes.length);
} catch (IOException e) {
e.printStackTrace();
}
return super.loadClass(name);
}
}
開始讀取類
public static void main(String[] args) {
try {
LocalClassLoader lcl = new LocalClassLoader();
Class<?> cls = lcl.loadClass("com.test.jdk.Key");
Field field = FieldUtils.getField(cls, "key", true);
Object value = field.get(cls.newInstance());
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
}
}
自定義類加載器正常加載到類,程式最後輸出:111111
URLClassLoader
上面自定義一個類加載器來讀取自定義的目錄,其實可以直接使用URLClassLoader就能讀取,它已經實作了路徑下類的讀取邏輯。
public static void main(String[] args) {
try {
URLClassLoader ucl = new URLClassLoader(new URL[]{new URL("c:/test/")});
Class<?> cls = ucl.loadClass("com.test.jdk.Key");
Field field = FieldUtils.getField(cls, "key", true);
Object value = field.get(cls.newInstance());
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
}
}
推薦閱讀
什麼是Spring Boot? Spring Boot開啟的2種方式 Spring Boot Starters啟動器 Spring Boot定制啟動圖案 Spring Boot核心配置 Spring Boot功能實戰 Spring Boot自動配置原理、實戰 Spring Boot Runner啟動器 Spring Boot - Profile不同環境配置看完有沒有收獲?分享到朋友圈給更多的人吧。