2
私は、アノテーションに最終的なアプリでどのようなクラスがあるのかを発見しました。これらの注釈はビルディングプロセスのいくつかのjar変換によって使用されているため、必要ですが、別の話です。
なぜ私の質問はjava.lang.invoke.LambdaForm$Hidden
アノテーションがランタイムアノテーションなのですか?どのコンポーネントがそれを使用していますか?どうして?
私は、アノテーションに最終的なアプリでどのようなクラスがあるのかを発見しました。これらの注釈はビルディングプロセスのいくつかのjar変換によって使用されているため、必要ですが、別の話です。
なぜ私の質問はjava.lang.invoke.LambdaForm$Hidden
アノテーションがランタイムアノテーションなのですか?どのコンポーネントがそれを使用していますか?どうして?
これは、スタックトレース内のラムダ関連フレームを隠すためにJVMランタイムによって使用されます。この例を見てみましょう:
public class LambdaStackTrace
{
public static void main(String[] args) throws Exception
{
"a".chars().forEach(c -> {
new Error().printStackTrace();
});
}
}
それは、このスタックトレースを生成します:
java.lang.Error
at LambdaStackTrace.lambda$0(LambdaStackTrace.java:6)
at java.lang.CharSequence$1CharIterator.forEachRemaining(CharSequence.java:149)
at java.util.Spliterators$IntIteratorSpliterator.forEachRemaining(Spliterators.java:1908)
at java.util.stream.IntPipeline$Head.forEach(IntPipeline.java:557)
at LambdaStackTrace.main(LambdaStackTrace.java:5)
しかし、場合デバッガでフレームスタックを見て、それはあなたに@Hidden注釈を持っている追加のフレームが表示されます:
を