50

C# への移植を検討している Java ライブラリがあります。Java ライブラリは、(ビルド時と実行時の両方で) 注釈を広範囲に使用します。

私は C# 属性を使用したことはありませんが、それらが Java 注釈とほぼ同等であることは理解しています。

注釈を置き換えるために属性を使用して移植を進める場合、何を知る必要がありますか? 何が同じになるのですか?違う?何が私を噛むつもりですか?

4

4 に答える 4

30

メタデータにアクセスできるようにするタイミングの制御は、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# では既定で実行時に使用できます。これは、変更する場合にのみ必要です。

于 2009-02-17T13:31:47.553 に答える
18

まだ詳しく見ていない Java アノテーションの重要な側面の 1 つは、メタプログラミングの形式としてjavac (Java 6 以降だと思います) 内でアノテーションを使用するコードを作成できることです。

確かに、 PostSharpは同様のことを可能にします。

(違いはそれだけではありませんが、今のところ時間があるのはそれだけです。)

于 2009-02-16T16:32:34.587 に答える
3

ジョンが言ったことに続いて...

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 を変更しています。)

とてもクールなもの... -- スコット

于 2009-02-16T19:27:02.233 に答える