C# への移植を検討している Java ライブラリがあります。Java ライブラリは、(ビルド時と実行時の両方で) 注釈を広範囲に使用します。
私は C# 属性を使用したことはありませんが、それらが Java 注釈とほぼ同等であることは理解しています。
注釈を置き換えるために属性を使用して移植を進める場合、何を知る必要がありますか? 何が同じになるのですか?違う?何が私を噛むつもりですか?
C# への移植を検討している Java ライブラリがあります。Java ライブラリは、(ビルド時と実行時の両方で) 注釈を広範囲に使用します。
私は C# 属性を使用したことはありませんが、それらが Java 注釈とほぼ同等であることは理解しています。
注釈を置き換えるために属性を使用して移植を進める場合、何を知る必要がありますか? 何が同じになるのですか?違う?何が私を噛むつもりですか?
メタデータにアクセスできるようにするタイミングの制御は、2 つの言語で異なります。
Java は、いつアノテーション メタデータにアクセスできるかを制御するjava.lang.annotation.Retentionアノテーションとjava.lang.annotation.RetentionPolicy列挙型を提供します。選択肢はRuntime
(最も一般的な - クラス ファイルに保持される注釈メタデータ) からSource
(コンパイラによって破棄されるメタデータ) までさまざまです。カスタム アノテーション インターフェイスにタグを付けるには、次のようにします。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.CLASS)
public @interface TraceLogging {
// etc
}
TraceLogging
実行時にカスタム アノテーションを反映させることができます。
C# は、コンパイル時のシンボルから駆動されるConditionalAttribute属性を使用します。したがって、C# での類似の例は次のとおりです。
[Conditional("TRACE")]
public class TraceLoggingAttribute : Attribute
{
// etc
}
これにより、シンボルが定義されTraceLogging
ている場合にのみ、コンパイラがカスタム属性のメタデータを吐き出します。TRACE
注意。属性メタデータは、C# では既定で実行時に使用できます。これは、変更する場合にのみ必要です。
まだ詳しく見ていない Java アノテーションの重要な側面の 1 つは、メタプログラミングの形式としてjavac (Java 6 以降だと思います) 内でアノテーションを使用するコードを作成できることです。
確かに、 PostSharpは同様のことを可能にします。
(違いはそれだけではありませんが、今のところ時間があるのはそれだけです。)
ジョンが言ったことに続いて...
Java 5 と Java 6 の両方でメタプログラミングが可能です。Java 5 は別の apt ツールを使用します。Java 6 はそれをコンパイラに統合します。(ただし、Java 5 apt は Java 6 でも引き続き使用できます)
残念ながら、それぞれが異なる API を使用しています。
現在、Bean アノテーションに Java 5 API を使用しています
例については、 http://code.google.com/p/javadude/wiki/Annotationsを参照してください(注: 現在、いくつかの主要な更新を行っており、その一部は API を変更しています。)
とてもクールなもの... -- スコット