如果需要從 /Users/xxx/IdeaProjects/xxx-demo/xxx-business-core/target/classes 目錄下加載編譯好的類,需要先遞歸出所有的class文件,然后load到JVM
public static Set<Class<?>> loadClasses(String rootClassPath) throws Exception {
Set<Class<?>> classSet = Sets.newHashSet();
// 設置class文件所在根路徑
File clazzPath = new File(rootClassPath);
// 記錄加載.class文件的數量
int clazzCount = 0;
if (clazzPath.exists() && clazzPath.isDirectory()) {
// 獲取路徑長度
int clazzPathLen = clazzPath.getAbsolutePath().length() + 1;
Stack<File> stack = new Stack<>();
stack.push(clazzPath);
// 遍歷類路徑
while (!stack.isEmpty()) {
File path = stack.pop();
File[] classFiles = path.listFiles(new FileFilter() {
public boolean accept(File pathname) {
//只加載class文件
return pathname.isDirectory() || pathname.getName().endsWith(".class");
}
});
if (classFiles == null) {
break;
}
for (File subFile : classFiles) {
if (subFile.isDirectory()) {
stack.push(subFile);
} else {
if (clazzCount++ == 0) {
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
boolean accessible = method.isAccessible();
try {
if (!accessible) {
method.setAccessible(true);
}
// 設置類加載器
URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
// 將當前類路徑加入到類加載器中
method.invoke(classLoader, clazzPath.toURI().toURL());
} catch (Exception e) {
e.printStackTrace();
} finally {
method.setAccessible(accessible);
}
}
// 文件名稱
String className = subFile.getAbsolutePath();
className = className.substring(clazzPathLen, className.length() - 6);
//將/替換成. 得到全路徑類名
className = className.replace(File.separatorChar, '.');
// 加載Class類
Class<?> aClass = Class.forName(className);
classSet.add(aClass);
System.out.println("讀取應用程序類文件[class={" + className + "}]");
}
}
}
}
return classSet;
}