阅读Java .class文件

6
我希望编写一个工具来生成一些代码,使用已编译的 .class 文件作为输入。具体而言,我想从这个类文件中读取:
  • 方法,包括注释
  • 方法参数,包括注释
输入的类文件可能会引用一些不在工具的类路径下的类型。这没关系,我只需要将完全限定的类型名称读取为字符串即可,不需要对它们进行任何操作。我确实需要从注释中获取一些信息,但它们都在工具的类路径下。
有没有可以用于此目的的库?如果其 API 类似于反射 API 就更好了,但这并非必须。

你有没有检查过 http://java.decompiler.free.fr/?q=jdgui - Vikas Patidar
@创意MITian:那似乎不是我需要的。我不需要反编译代码,我只需要元信息(可以在运行时通过反射访问)。我还需要一个嵌入到我的工具中的库,但那个反编译器本身就是一个工具。 - Bart van Heukelom
6个回答

6

ASM http://asm.ow2.org/ 可以让你从文件或输入流中读取类而不必加载它。它可以让你查看在运行时没有被加载的注释。它还可以用于修改类的字节码/注释/方法等。


它能直接从jar文件中读取.class文件吗,还是需要先解压缩jar文件? - Gaurav
1
@gaurav 这个库支持读取InputStream,它可以是类路径(或Jar文件)中的资源。 - Peter Lawrey

4

JDK中包含的javap工具可能已经满足您的需求。


看起来是这样。链接的页面没有显示任何注释,但我认为它们在那里。我可以直接使用它的库,而不运行命令行工具和解析输出吗? - Bart van Heukelom
您可以使用反射 API 获取所有信息,但是要分析的类需要在类路径上。 - Jesper
1
javap 的输出不是供程序使用的。它有许多遗漏和歧义,只适用于快速调试工具。 - Antimony
@Antimony 我的意思是:你不需要自己编写这样的工具,因为JDK中已经存在了这样的工具,那就是javap。我并不建议你编写一个工具来解析javap的输出结果。 - Jesper
1
我的观点是,javap不能满足OP的要求。 - Antimony

3

1
错误:q说他想从类文件中读取,但这不会将类加载到虚拟机中。 - mP.

1

我认为你可以使用Spring类扫描。

ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true);
String basePackage = "org/springframework/samples/petclinic";
Set<BeanDefinition> components = provider.findCandidateComponents(basePackage);
for (BeanDefinition component : components) {
    System.out.printf("Component: %s\n", component.getBeanClassName());
}

如需更多信息,您可以查看Spring 文档


1

我正在使用asm来查找所有的方法。


0

如果你可以生成 .class 文件,那么 反射 API 应该可以帮到你。


2
Reflection API必须首先加载类,这与尝试在加载之前从文件中读取相同信息并不完全相同。 - mP.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接