“魔术”是指具有语义的方法,这些语法不用纯Java表达。
我知道所有native
方法都很神奇,因为它们的实现是由底层运行时提供的,而不是由Java字节码提供的。
反过来了吗?是所有魔术方法native
,还是有一些神奇的方法显然是用纯Java实现的,但是有一些JVM特殊外壳的额外帮助?
用例是我想通过检测其字节码来修改Java的语义。所有这些神奇的方法都是特殊情况,我将不得不以某种方式处理。 native
个都很明显,但我想知道是否有任何无标记的魔术方法我需要注意和特殊情况。
答案 0 :(得分:5)
不幸的是,除了原生方法之外还有“神奇”的方法。看一下内部方法 - 这些方法是JIT已知的,它在编译方法时使用手动滚动实现,并包含大量调用的方法,如String.indexOf,Integer.numberOfLeadingZeros等。
在Intrinsics下查看here,了解一些详细信息以及如何确定哪些方法在JVM上进行了内部化。我不确定注入字节码是否会关闭内部化,但是有一个DisableIntrinsic XX选项可用于禁用选定的内在函数。
答案 1 :(得分:0)
您可能会发现AspectJ已经处理了很多细节。在进行手动字节码操作之前,我会先看看它。