使用java注释可以做什么,不可以做什么?

使用java注释可以做什么,不可以做什么?,java,annotations,Java,Annotations,典型的用例是针对简单的事情,比如@Override,但显然你可以用它们做更多的事情。如果你突破了它们的极限,你会得到这样的结果,尽管我的理解是这是对注释的巨大滥用。你到底能做什么?在编译时和运行时使用注释可以做什么?你不能做什么 我们使用运行时注释和反射来定制到数据库的域模型映射。此外,我们的表单验证基于运行时使用的代码中的注释 此外,您还可以使用Java附带的注释处理器对源文件进行预处理 编辑:正如在问题中所问的那样,添加了一种新的更强大的方法来使用这种注释处理,比这里大多数人认为可能的方法都

典型的用例是针对简单的事情,比如@Override,但显然你可以用它们做更多的事情。如果你突破了它们的极限,你会得到这样的结果,尽管我的理解是这是对注释的巨大滥用。你到底能做什么?在编译时和运行时使用注释可以做什么?你不能做什么

我们使用运行时注释和反射来定制到数据库的域模型映射。此外,我们的表单验证基于运行时使用的代码中的注释

此外,您还可以使用Java附带的注释处理器对源文件进行预处理

编辑:正如在问题中所问的那样,添加了一种新的更强大的方法来使用这种注释处理,比这里大多数人认为可能的方法都要强大。让我用几句话来描述这一点:它们在

  • Java编译器和
  • 生成代码解析树的EclipseIDE

  • 通过这种方式,eclipse向您展示了更多您真正编写的代码,javac也相信这一点。生成器技术使用老式的Java注释处理,但您可以认为Lombok是每个人都缺少的粘合剂,使其真正有用。

    注释是元数据,是关于信息的信息,在本例中是您的代码

    使用注释,您可以向注释的使用者提供提示和线索,例如编译器或运行时的代码本身。我曾经在一些场合仔细地使用过它们,它们的存在取代了对其他布尔比较求值为true的需要,属性提供了更多关于实际需要做什么的信息,因为注释存在

    关于你不能用注解做的事情。。我不知道该怎么回答。如果它们能解决实际问题或使您的代码更加优雅,请使用它们,但不要强行使用


    请原谅我可能过于简化了。

    注释属于反射。注释本身并不能提供任何功能,您需要在代码中使用它们,或者将它们与动态代理或字节码重写(也属于反射领域)等功能结合使用

    反射被认为是非常强大的,但同时也可能是危险的

    我认为潜在的问题是:“注释的合法用途是什么,或者更普遍地说是反射?”

    由于反射和安全之间存在紧张关系(破坏类型系统、访问最终字段等),因此有两个阵营:拥护元编程的阵营和拥护安全的阵营。什么是合法的最终是品味和观点的问题

    相关问题:


    根据您的评论,您似乎对JSR-269和编译过程中的挂钩最感兴趣。我看到了JSR-269的两个用例:用于自定义错误/语义检查(例如覆盖),用于DSL/语言工程。我不知道它是否被广泛用于黑客攻击和实验。下面是一位同事的一些很酷的链接:


    也就是说,字节码转换/编译器挂钩仍然属于元编程。例如,您可以在编译时生成像Lombok中那样的getter/setter,或者在运行时使用一个动态代理。所以对我来说,这种二元性意味着我们仍然处在反射的领域

    我很确定你不能用注释来洗衣服

    但除此之外,根据我的经验,注释还有一些真正的局限性:

  • 它们是静态的。这意味着您不能让某些动态运行时配置替换它们。因此,如果从注释中检索到数据库信息,这可能会非常有限。这样做的框架最终往往需要配置机制、注释和一些XML或其他动态机制。不太妙
  • 与1号相关,它们很难测试。设想一个框架必须处理一些注释。创造所有的变化来测试是一个锅炉板很多
  • 它们很难消费。反射问题和一般困难都使得框架适合要求其用户编写注释,但您永远不会希望框架用户必须分析参数上的注释以确定任何内容
  • 这个问题非常(太?)广泛,所以我只举一个我觉得有趣的例子。JPA2.0依赖于为实体生成静态元模型类(用于带有CriteriaAPI的类型安全查询)

    另见
    • (Hibernate的实现)

    从@Data注释来看,Lombok很有趣:“所有字段上都有@ToString、@EqualsAndHashCode、@Getter和@Setter的快捷方式,所有非最终字段上都有@Setter。你甚至可以得到一个免费的构造函数来初始化最终字段!”如果你需要一个工具来自动生成所有字段上的Getter和Setter,您的代码有问题。@Claudiu:更不用说“@Setter on all non-final fields”完全是错误的做法。@doublep,在许多情况下,这是正确的做法。不是在所有情况下,但是,嘿,那你就不用它了。@gustafc:如果这样做是正确的,那么就将这些字段声明为公共的。@Caludiu,有时候你需要它来处理DTO类型的对象,其中getter和setter只是一个样板。你能给出一个例子或链接,说明如何生成带有注释的代码(如Lombok项目所示)?这是一个很好的观点,但注释也有相反的属性-它们可以在没有类型安全的情况下引入类型安全性(例如,当替代方案是XML配置时)