【问题标题】:What are the similarities and differences between Java Annotations and C# Attributes?Java Annotations 和 C# Attributes 有什么异同?
【发布时间】:2010-10-07 22:04:39
【问题描述】:

我有一个 Java 库,正在考虑移植到 C#。 Java 库广泛使用注释(在构建时和运行时)。

我从未使用过 C# 属性,但知道它们大致相当于 Java 注释。

如果我继续使用属性替换注释的端口,我需要知道什么?什么会是一样的?不同的?什么会咬我?

【问题讨论】:

    标签: c# java attributes annotations custom-attributes


    【解决方案1】:

    两种语言对何时可访问元数据的控制是不同的。

    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
    }
    

    这将导致编译器仅在定义了 TRACE 符号时才为您的自定义 TraceLogging 属性吐出元数据。

    注意。默认情况下,C# 中的属性元数据在运行时可用 - 仅当您想更改它时才需要。

    【讨论】:

    • +1:保留到运行时对于端口很重要。谢谢。
    • 是的。请注意,根据我上次的编辑,如果您什么都不做,您将能够反映您的自定义 C# 属性。这种机制允许您关闭默认行为,老实说,这可能是有限的实用程序。
    【解决方案2】:

    Java 注释的一个重要方面我还没有详细研究过:您可以编写在 javac 中使用注释的代码(我相信从 Java 6 开始)as a form of metaprogramming

    PostSharp 允许类似的东西,诚然。

    (这远非唯一的区别,但我现在有时间。)

    【讨论】:

    • 虽然我很看好,但我实际上并没有使用 APT API——我的代码使用反射(和一个 doclet)来完成它的工作(而不是使用 APT 来生成一组中间构建过程中的东西。)所以,我认为我并不担心这种缺失的能力。让他们来:)
    • 乔恩 - 只是告诉你这个问题有 100 分的赏金 - 如果你有更多的时间花在给出更完整的答案上(而且分数是值得的) - 我' d当然欢迎:)。谢谢!
    • 嗯...我会看看能不能抽出时间来研究一下。不过我可能没有时间:(
    【解决方案3】:

    一个有趣的区别是 C# 允许模块和程序集级别的属性。这些属性应用于您的模块或程序集,并且可以通过反射以正常方式获得。 Java 不提供对 jar 文件的反射,因此无法使用 jar 级别的注释。

    事实上,这在 Visual Studio 中很常见,在根项目级别有一个名为 AssemblyInfo.cs 的文件,其中包含例如:

    [assembly: AssemblyVersionAttribute("1.2.3.4")]
    [assembly: AssemblyTitleAttribute("My project name blah blah")]
    ...
    

    Java 中没有等效的 jar 级别注释(尽管从 jdk5 开始,有一点使用的包级别注释机制 - 感谢mmeyers 指出这一点)

    【讨论】:

    【解决方案4】:

    跟进乔恩所说的话......

    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。)

    非常酷的东西... -- 斯科特

    【讨论】:

      猜你喜欢
      • 2011-02-08
      • 2018-11-05
      • 1970-01-01
      • 2015-02-20
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多