私は次のコードを持っています
@UIUnitTimeout(8*60*1000) // works
@UIUnitTimeout(TimeUnit.MINUTES.toMillis(8)) // does not work
JLSによれば、注釈属性の値として定数式のみが許可されていることを知っています。しかし、なぜ?データ型が一致するだけでは不十分なのはなぜですか? 式が実行時に評価される場合、問題が発生する可能性はありますか? すべての仕様には論理的な理由がありますか?
私は次のコードを持っています
@UIUnitTimeout(8*60*1000) // works
@UIUnitTimeout(TimeUnit.MINUTES.toMillis(8)) // does not work
JLSによれば、注釈属性の値として定数式のみが許可されていることを知っています。しかし、なぜ?データ型が一致するだけでは不十分なのはなぜですか? 式が実行時に評価される場合、問題が発生する可能性はありますか? すべての仕様には論理的な理由がありますか?
注釈は、型拡張または型に関するメタデータのようなものです。
Java は静的に型付けされた言語であるため (つまり、型はコンパイル時に認識されます)、注釈属性データ (メタデータ) もコンパイル時に認識されるのが合理的と思われます。注釈 (拡張) に関するデータを定義/宣言しています。
また、純粋に実用的な点として、コンパイル時 (オプション) のステップである注釈処理の場合、コンパイル時に属性データを認識している必要があります。まだランタイム環境に到達していませんが、属性データが必要です。
アノテーションの前処理では、アノテーション付きコードを実行する前に、アノテーションの値を知る必要があります。さらに、アノテーション定義自体に @Retention のアノテーションが付けられます。これにはRetentionPolicyの値があります (指定されていない場合は、デフォルトで CLASS になります)。
したがって、3 つの異なる「種類」の注釈があり、RUNTIME として宣言された注釈のみが、プログラムの実行時に使用可能になります。(ただし、関連付けられたコードを実行せずに定義されたままになるように、それらの値は定数でなければなりません。)
CLASS 注釈は、コンパイラによってクラス ファイルに記録されますが、実行時に VM によって保持される必要はありません。
RUNTIME 注釈は、コンパイラによってクラス ファイルに記録され、実行時に VM によって保持されるため、リフレクティブに読み取ることができます。
SOURCE アノテーションはコンパイラーによって破棄されます。
.