java 动态加载class;写了A B类,都没有main方法。其中 A类中有静态方法f,其功能是动态加载类B的class文件。类B中有个函数;在idea中运行是没问题的 A.T.sum(2,7)) 可以调用。但是一旦把这个程序打成jar包后。在其他工程里引入jar包,就不能动态加载该类B。请大神指导下
package fff.BB;
/**
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;
}
}
考虑下打包成jar后路径问题
public static B T = null; 这块不对吧
找的原因了,是因为打成jar后,读取的类型是jar文件