1

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

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

原谅我的咆哮,但只是说出我不想说的话:我找到了http://asm.ow2.org/,它提供了对我需要的字节码的访问,但是:API 似乎是为字节码操作量身定制的(不是纯粹的自省),并且它基于访问者模式是顽固的,几乎不可能通过我的 IDE 的自动完成来发现它的工作原理,并且没有一个 visit*() 方法真正将字节码语义与 Java 对象联系起来,但是字符串混合方法完全签名和返回类型签名。我什至不确定字节码是否在某处定义了任何常量。

虽然我能够使用它,但它真的很优雅。我想知道还有哪些其他 Java 库的哲学更类似于 Mono.Cecil 和 .NET 自己的System.Reflection.MethodBody对象?

4

2 回答 2

1

我一直在研究一个 Java 反编译器,它使用基于 Mono.Cecil 的类型/元数据系统。它可能足以满足您的需求。你可以在这里找到它。

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

于 2013-05-13T13:10:54.707 回答
1

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

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

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

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

于 2013-05-10T15:31:54.960 回答