私はの.jarファイルのバイトコードを見ていたカスタム注釈付きのjdk-8で中央Mavenのリポジトリから供給されたチェッカーフレームワーク。
私は、いくつかの不正なJavaコードをそこに気づいObject.class
およびClass.class
ファイル。私はEclipseでjarファイルをロードするときには、次の構文で注釈しました。
@jdk.Profile+Annotation(value=(int) 1)
public class java.lang.Object {
さて、限り私の知識が行くように、この注釈名が無効のJavaです。しかし、私はそれが(匿名クラスにコンパイラ割り当てられる名前に類似)コンパイラに何かを意味するかもしれないと仮定しています。私は確信したものではないと私はどちらかのオンライン検索でそれについて何かを見つけることができませんでした。したがって、クエリ。
すべてのヘルプは大歓迎です。
私はそれが特別な意味を持っているとは思いません。それはに関連するシステムの注釈のJEP 161あなたはJREのサブセットにアプリケーションを実行できるように、添加剤「プロファイル」を追加しました。それは文法の規則に準拠する必要はありませんので、それをプログラム的に追加されます。
OpenJDKのバグトラッカー検索このJEP用は上がって「合成」の注釈が追加されているコミット。
前例はすでにのために設立されたかのように見えsun.Proprietary+Annotation
、彼らは単に慣例に従いました。
私は、その理由は、Sunアノテーションは方法は、時間の年代記に失われたことを命名されたと思われる - それは、Java 6を先行し、コードがオープンソースだった前。
私も見jdepsにコミットし、彼らは彼らが命名される方法への重要性を与えていないこれらのアノテーションを解析しています。彼らは両方のための完全修飾名を使用します。
あなたも違法タイプ識別子を使用して起動することができます - オラクルでは何のキャリアは必要ありません!
final DynamicType.Unloaded<? extends Annotation> unloaded = new ByteBuddy()
.with(TypeValidation.DISABLED)
.makeAnnotation()
.name("jdk.Profile+Annotation")
.make();
final DynamicType.Loaded<? extends Annotation> loaded = unloaded.load(Test.class.getClassLoader());
final Class<? extends Annotation> myBadlyNamedAnnotation = loaded.getLoaded();
System.out.println(myBadlyNamedAnnotation);