java 动态加载class;写了A B类,都没有main方法。其中 A类中有静态方法f,其功能是动态加载类B的class文件。类B中有个函数;在idea中运行是没问题的 A.T.sum(2,7)) 可以调用。但是一旦把这个程序打成jar包后。在其他工程里引入jar包,就不能动态加载该类B。请大神指导下
package fff.BB;
/**
- Created by ***** on 2017/6/22. */ public class B { public int sum(int x, int y){ return x+y; } }
import fff.BB.B;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.Set;
/**
-
Created by liweidong on 2017/6/22.
*/
public class A {
public static B T = null;
static {
registerReset();
}
private static void registerReset(){
Set> classSet = loadClass();
for(Class cl : classSet){
try {
T = (B) cl.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
}private static Set> loadClass(){
String packageDir = "fff.BB";
Set> classSet = new LinkedHashSet>();
try {
Enumeration dirs = Thread.currentThread().getContextClassLoader().getResources(packageDir.replace('.','/'));
while (dirs.hasMoreElements()){
URL url = dirs.nextElement();
String packagePath = URLDecoder.decode(url.getFile(),"UTF-8");
Class<?> loadClass = findClass(packageDir,packagePath);
if(loadClass != null){
classSet.add(loadClass);
}
}
}catch (IOException e){} return classSet;
}
private static Class<?> findClass(String packageName,String packagePath){
File dir = new File(packagePath);
if(!dir.exists() || !dir.isDirectory()){
return null;
}File[] dirfiles = dir.listFiles(file -> (file.getName().endsWith(".class"))); for(File file : dirfiles){ String className = file.getName().substring(0, file.getName().length() - ".class".length()); Class<?> clazz = null; try { clazz = Thread.currentThread().getContextClassLoader().loadClass(packageName + "." + className); if(clazz != null){ return clazz; } } catch (ClassNotFoundException e) { e.printStackTrace(); } } return null;
}
}