次のコードは、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