我认为我会在未来的代码中自动执行错误检测,前提是我们的一些代码需要显式释放连接对象,因为我们认为这是我们使用的Java HTTP API中的一个错误(不重要的是它是哪个API) )。
这个想法很简单:对于类A上的每个方法,如果该方法调用具有可从Response
分配的返回类型的方法,则该方法也应该在返回时调用close()
值。所有这些都没有在被检查的类中实际运行任何代码。
原谅我的咆哮,但只是想说出我不想要的东西:我找到了http://asm.ow2.org/,它提供了我所需的字节码的访问权限,但是:API似乎是为字节码操作而定制的(没有纯粹的内省并且它基于访问者模式而死硬,这使得几乎无法通过IDE的自动完成功能发现其工作方式,并且访问*()方法都没有真正指出字节码语义与Java对象,但字符串混合方法签名和返回类型签名一起。我甚至不确定字节码是否在某处定义了任何常量。
虽然我能够使用它,但它非常优雅。我想知道其他Java库是否与Mono.Cecil和.NET自己的System.Reflection.MethodBody
对象更相似?
答案 0 :(得分:1)
不幸的是,ASM和BCEL几乎是黄金标准字节码操作库。如果你不喜欢它们,你可能需要自己修改它们或采取不同的方法。
编辑:Soot是另一个主要的字节码操作库。你可以尝试一下。
我对ASM和BCEL不太熟悉,但我已经编写了自己的字节码操作工具,可以在Github上找到。不幸的是,它们是A)用Python编写的,而不是Java,而B)几乎没有记录。
我认为最好的方法是修改验证程序,为类型添加一些额外的元数据。验证器已经做了类似的事情以确保对象被正确初始化,因此不难修改它以确保对象被关闭,只要关闭状态可以静态表示为类型系统的一部分(即它们'在关闭之前仅存储在局部变量中,而不与已经关闭的对象混合)。
答案 1 :(得分:1)
我一直致力于使用基于Mono.Cecil的类型/元数据系统的Java反编译器。它可能足以满足您的需求。你可以找到它here。
其中还有许多其他.NET启发的API,包括反射API和LINQ / DLR表达式树(带编译器)的实现。