Lol*_*lly 8 java jar interface
我想找出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;
}
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法来做到这一点?因为如果有一个包含100个类文件且第100个类的jar已实现此接口,通过上面的代码我需要迭代所有100个类文件并查找它是否已实现接口.有没有有效的方法呢?
Sea*_*oyd 10
该思考图书馆可以这样做:
Reflections reflections = new Reflections(
ClasspathHelper.forPackage("your.root.package"), new SubTypesScanner());
Set<Class<? extends YourInterface>> implementingTypes =
reflections.getSubTypesOf(YourInterface.class);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7457 次 |
| 最近记录: |