好的,所以我有这个jar文件 我想要检索那个jar里面的所有类。
我已经看到了其他一些问题,但是,大多数都需要类名或包名。
我想要一些不需要的东西。也许是一个请求文件路径“example.jar”的方法,然后它返回一个包含各种类名的列表。
顺便说一下,如果类名是正确的术语,我现在不是真的,我需要的是这样的“com.name.name1”。
我会使用反射从jar中检索到的字符串。 结果是动态加载jar而不需要任何类名。
答案 0 :(得分:1)
jar文件基本上只是一个zip文件。您可以使用ZipInputStream
打开它并扫描内容。名称以".class"
结尾的任何文件都应该是一个类,您可以相当容易地重建包名称等。
或者,如果您想了解有关这些类的更多信息,您应该使用一个为您处理类解析的库(如this one) - 它相对复杂。
答案 1 :(得分:0)
您可以使用JarFile#entries
获取ZIP文件条目的枚举,而不是使用URLClassLoader
来获取类:
private List<Class<?>> loadClasses(String pathToJar){
ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
JarFile jarFile = null;
try {
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;
}
String className = je.getName().substring(0,je.getName().length()-String.valueOf(".class").length());
className = className.replace('/', '.');
Class<?> clazz = cl.loadClass(className);
classes.add(clazz);
}
} catch (IOException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}finally {
try {
jarFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return classes.isEmpty() ? null : classes;
}