我正在尝试编写一个简单的代码分析器,对于初学者,只想创建一个ClassLoader
实例,其类路径是一个jar文件,与实际代码分析器应用程序的类路径无关。然后我想获得所有条目的列表,然后在类路径的上下文中对每个条目使用反射来进行一些基本的代码分析并将结果制成表格。
是否可以创建一个包含单个jar的ClassLoader,可以使用反射进一步分析其列表?
例如,创建一个自定义加载器:
String clspath = "/my/dir/myjar.jar";
URL clspathURL = null;
try {
clspathURL = new URL("file:///" + clspath);
} catch(MalformedURLException badURLex) {
}
然后做一些事情来列出它加载的所有类OR(不确定它是否在初始化时加载它可用的所有类)如果它没有加载所有类,加载它们
然后可以使用反射进行内存代码分析。
答案 0 :(得分:1)
从jar中获取文件列表并加载用于反射的类是两个独立的事情。第一个使用ZipInputStream
,第二个任务使用URLClassLoader
:
URL jar = ...;
ClassLoader cl = new URLClassLoader(new URL[]{jar});
ZipInputStream zip = new ZipInputStream(jar.openStream());
while(true) {
ZipEntry e = zip.getNextEntry();
if (e == null)
break;
String nameAsInZip = e.getName():
if(nameAsInZip.endsWith(".class")) {
String nameForClassLoader = ....; // transform name for CL
Class clazz = cl.loadClass(nameForClassLoader);
// analyze class
}
}