Java相当于Mono.Cecil或.NET的反射,可以访问MSIL代码

时间:2013-05-10 14:41:16

标签: java reflection bytecode

我认为我会在未来的代码中自动执行错误检测,前提是我们的一些代码需要显式释放连接对象,因为我们认为这是我们使用的Java HTTP API中的一个错误(不重要的是它是哪个API) )。

这个想法很简单:对于类A上的每个方法,如果该方法调用具有可从Response分配的返回类型的方法,则该方法也应该在返回时调用close()值。所有这些都没有在被检查的类中实际运行任何代码。

原谅我的咆哮,但只是想说出我不想要的东西:我找到了http://asm.ow2.org/,它提供了我所需的字节码的访问权限,但是:API似乎是为字节码操作而定制的(没有纯粹的内省并且它基于访问者模式而死硬,这使得几乎无法通过IDE的自动完成功能发现其工作方式,并且访问*()方法都没有真正指出字节码语义与Java对象,但字符串混合方法签名和返回类型签名一起。我甚至不确定字节码是否在某处定义了任何常量。

虽然我能够使用它,但它非常优雅。我想知道其他Java库是否与Mono.Cecil和.NET自己的System.Reflection.MethodBody对象更相似?

2 个答案:

答案 0 :(得分:1)

不幸的是,ASM和BCEL几乎是黄金标准字节码操作库。如果你不喜欢它们,你可能需要自己修改它们或采取不同的方法。

编辑:Soot是另一个主要的字节码操作库。你可以尝试一下。

我对ASM和BCEL不太熟悉,但我已经编写了自己的字节码操作工具,可以在Github上找到。不幸的是,它们是A)用Python编写的,而不是Java,而B)几乎没有记录。

我认为最好的方法是修改验证程序,为类型添加一些额外的元数据。验证器已经做了类似的事情以确保对象被正确初始化,因此不难修改它以确保对象被关闭,只要关闭状态可以静态表示为类型系统的一部分(即它们'在关闭之前仅存储在局部变量中,而不与已经关闭的对象混合)。

答案 1 :(得分:1)

我一直致力于使用基于Mono.Cecil的类型/元数据系统的Java反编译器。它可能足以满足您的需求。你可以找到它here

其中还有许多其他.NET启发的API,包括反射API和LINQ / DLR表达式树(带编译器)的实现。