1 使用guava
ClassPath classPath = ClassPath.from(Application.class.getClassLoader());
ImmutableSet<ClassPath.ClassInfo> clzs=classPath.getTopLevelClasses("package全路径");
for(ClassPath.ClassInfo info: clzs){
Class clz=info.load();
//处理逻辑
......
}
2 从spring那学的
final String base="package全路径";
final String folder=base.replace('.','/');
Enumeration<URL> urls=Application.class.getClassLoader().getResources(folder);
while (urls.hasMoreElements()){
File file=new File(urls.nextElement().toURI());
String[] classes=file.list((f,n)->n.endsWith(".class"));
if(classes!=null){
for(String clz :classes){
String fullClz=base+"."+clz.substring(0,clz.length()-6);
Class c=Class.forName(fullClz);
//处理逻辑
.......
}
}
}
while (urls.hasMoreElements()){
URL url=urls.nextElement();
if("file".equals(url.getProtocol())){
File file=new File(url.toURI());
String[] classes=file.list((f,n)-> n.endsWith(".class"));
if(classes!=null){
for(String clz :classes){
String fullClz=packageName+"."+clz.substring(0,clz.length()-6);
//处理逻辑
.......
}
}
}else if("jar".equals(url.getProtocol())){
JarFile jar = ((JarURLConnection) url.openConnection()).getJarFile();
//从此jar包 得到一个枚举类
Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements()){
JarEntry entry=entries.nextElement();
String name = entry.getName();
if(!name.startsWith(folder)){
continue;
}
if (name.endsWith(".class") && !entry.isDirectory()) {
String fullClz=packageName+"."+name.substring(name.lastIndexOf('/')+1,name.length()-6);
//处理逻辑
.......
}
}
}
}