jar 内のクラスが特定のインターフェイスを実装しているかどうかを確認したい。以下のコードを実装しましたが、jar ファイル内のすべてのクラスを反復処理し、各クラスでこの特定のインターフェイスを実装しているかどうかを確認します。
public static synchronized boolean findClassesInJar(final Class<?> baseInterface, final String jarName){
final List<String> classesTobeReturned = new ArrayList<String>();
if (!StringUtils.isBlank(jarName)) {
//jarName is relative location of jar wrt.
final String jarFullPath = File.separator + jarName;
final ClassLoader classLoader = this.getClassLoader();
JarInputStream jarFile = null;
URLClassLoader ucl = null;
final URL url = new URL("jar:file:" + jarFullPath + "!/");
ucl = new URLClassLoader(new URL[] { url }, classLoader);
jarFile = new JarInputStream(new FileInputStream(jarFullPath));
JarEntry jarEntry;
while (true) {
jarEntry = jarFile.getNextJarEntry();
if (jarEntry == null)
break;
if (jarEntry.getName().endsWith(".class")) {
String classname = jarEntry.getName().replaceAll("/", "\\.");
classname = classname.substring(0, classname.length() - 6);
if (!classname.contains("$")) {
try {
final Class<?> myLoadedClass = Class.forName(classname, true, ucl);
if (baseInterface.isAssignableFrom(myLoadedClass)) {
return true;
}
} catch (final ClassNotFoundException e) {
}
}
}
}
return false;
}
これを行う簡単な方法はありますか?100 個のクラス ファイルを含む jar があり、100 番目のクラスがこのインターフェイスを実装している場合、上記のコードを使用して、100 個のクラス ファイルすべてを反復処理し、インターフェイスが実装されているかどうかを確認する必要があります。それを行う効率的な方法はありますか?