假设我有一个自定义Java编译器或字节码代理。
是否可以将调用站点字节码传递给我的引导处理程序,这种方式不需要我生成一个匿名类来“托管”合成方法中的字节码?
即使我已经传递了字节码,我想以尽可能少的开销执行它(假设我已经有了堆栈和局部变量数组,以便字节码正常工作)
答案 0 :(得分:0)
InvokeDynamic的工作方式是第一次执行指令时,调用适当的bootstrap方法。 Bootstrap方法返回的CallSite对象将在此指令和所有后续调用上执行。这个想法是VM可以比每次查找方法的ad hoc方法更有效地处理它。
但是,这并没有解决所有字节码必须在要执行的类中的要求。这就是JVM平台的工作方式。我不确定为什么你认为创建一个新类会产生开销。它可以像任何其他方法一样内联。由于额外的类,更大的问题是为代码分配的内存空间不足,但我相信Java 7还提供了一些库调用来帮助解决这个问题。
答案 1 :(得分:0)
好的,所以我终于找到了我需要的东西:
http://www.docjar.com/html/api/sun/invoke/anon/AnonymousClassLoader.java.html
它还没有标准化,可能会被抛弃,但它可以让人感觉更轻松。
John Rose在他的博客上谈到了这个问题:
https://blogs.oracle.com/jrose/entry/anonymous_classes_in_the_vm
另一种选择可能是将调用字节代码转换为MethodHandles并将其传递给。