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()获取的