以下代码从 JAR 文件加载所有类。它不需要知道有关类的任何信息。类的名称是从 JarEntry 中提取的。
JarFile jarFile = new JarFile(pathToJar);
Enumeration<JarEntry> e = jarFile.entries();
URL[] urls = { new URL("jar:file:" + pathToJar+"!/") };
URLClassLoader cl = URLClassLoader.newInstance(urls);
while (e.hasMoreElements()) {
JarEntry je = e.nextElement();
if(je.isDirectory() || !je.getName().endsWith(".class")){
continue;
}
// -6 because of .class
String className = je.getName().substring(0,je.getName().length()-6);
className = className.replace('/', '.');
Class c = cl.loadClass(className);
}
编辑:
正如上面的评论所建议的那样,javassist也是一种可能性。在 while 循环形成上述代码之前的某个位置初始化 ClassPool,而不是使用类装入器加载类,您可以创建一个 CtClass 对象:
ClassPool cp = ClassPool.getDefault();
...
CtClass ctClass = cp.get(className);
从ctClass中,您可以获得所有方法,字段,嵌套类,....看看javassist api:https://jboss-javassist.github.io/javassist/html/index.html