Java Annotations 和 C# Attributes 有啥异同?

Posted

技术标签:

【中文标题】Java Annotations 和 C# Attributes 有啥异同?【英文标题】: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 注释。

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

【问题讨论】:

【参考方案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 指出这一点)

【讨论】:

Java 中实际上有包级别的注解:见java.sun.com/docs/books/jls/third_edition/html/…。 这些不适用于所有公共类型!它们仅适用于程序集或模块。【参考方案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。)

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

【讨论】:

以上是关于Java Annotations 和 C# Attributes 有啥异同?的主要内容,如果未能解决你的问题,请参考以下文章

java反射中啥叫方法参数的Annotations,getParameterAnnotations()获取的

Java注释Annotations 作用

java #annotations

Core Java Volume II—Using annotations

使用Java Annotations访问类属性的值

hibernate中的annotations是啥意思