0

假设我有一个自定义 Java 编译器或字节码代理。

是否可以以不需要我生成匿名类来“托管”合成方法中的字节码的方式将调用站点字节码传递给我的引导处理程序?

即,一旦我通过了字节码,我想以尽可能少的开销执行它(假设我已经获得了堆栈和局部变量数组,正好可以让字节码工作)

4

2 回答 2

0

InvokeDynamic 的工作方式是在第一次执行指令时调用适当的引导方法。由 bootstrap 方法返回的 CallSite 对象在此指令和所有后续指令调用上执行。这个想法是,VM 可以比每次都查找方法的临时方法更有效地处理这个问题。

但是,这并没有解决所有字节码必须在一个类中才能执行的要求。这就是 JVM 平台的工作方式。但是,我不确定您为什么认为创建新类会产生开销。它可以像任何其他方法一样被内联。更大的问题是由于额外的类,分配给代码的内存空间不足,但我相信 Java 7 也提供了一些库调用来帮助解决这个问题。

于 2013-06-22T09:06:37.577 回答
0

好的,所以我终于找到了我需要的东西:

http://www.docjar.com/html/api/sun/invoke/anon/AnonymousClassLoader.java.html

它还没有标准化,可能会被抛弃,但它允许更轻的触感。

约翰·罗斯在他的博客上谈到它:

https://blogs.oracle.com/jrose/entry/anonymous_classes_in_the_vm

另一种选择可能是将调用字节码转换为 MethodHandles 并通过它。

于 2013-08-26T20:21:20.997 回答