注解在Java中是如何工作的?
注解一直是 Java 的一个非常重要的部分,它从 J2SE 5.0 开始就已经存在了。在我们的应用程序代码中,经常看到 1. 注解是什么?用一个词来可以解释:注解即是元数据。元数据是关于数据的数据。所以注解是代码的元数据。举个例子,查看下面的代码。 @Override public String toString() { return "This is String Representation of current object."; } 我在以上代码中重写 注解是一种特殊的 Java 构造,用于修饰类、方法、字段、参数、变量、构造函数或包。这是 JSR-175 选择的提供元数据的工具。 2. 为什么引入注解?在注解出现之前(甚至之后),XML 被广泛地用于元数据,但是,一部分特定的应用程序开发人员和架构师认为 XML 维护变得麻烦了。他们希望能够通过某种方式与代码紧密耦合,来代替 XML,因为 XML 与代码非常松散地耦合(在某些情况下,几乎是独立的)。如果你在谷歌上搜索 “XML vs annotations”,你会发现很多有趣的争论。有趣的一点是,XML配置是为了将配置从代码中分离出来而引入的。最后两种说法可能会在你的脑海中产生一些疑问,即这两种说法都在创造一个循环,但两者各有优缺点。让我们试着用一个例子来理解。 假设您希望设置一些应用程序范围的常量/参数。在这个场景中,XML将是一个更好的选择,因为这与任何特定的代码段无关。如果您希望将某些方法公开为服务,那么注解将是一个更好的选择,因为它需要与该方法紧密耦合,并且该方法的开发人员必须知道这一点。 另一个重要因素是注解定义了在代码中定义元数据的标准方法。在注解之前,人们还使用自己的方法来定义元数据。一些例子是使用标记接口、注解、临时关键字等。每个开发人员都需要根据自己的方式来决定元数据,但是注解是标准化的东西。 如今,大多数框架都将XML和注解结合起来,充分利用两者的优点。 3.注解如何工作以及如何编写自定义注解在开始解释之前,我建议您下载这个注释(AnnotationsSample.zip) 的示例代码,并在您常用的 IDE 中保持打开,因为它将帮助您更好地理解下面的解释。 编写注解非常简单。您可以将注解定义与接口定义进行比较。让我们看两个例子 — 一个是标准 @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { } 似乎有些可疑之处 当我们谈论标准注解时,比如 让我们逐一理解用于编写注解的关键术语。在上面的例子中,您将看到注解如何被应用。 J2SE 5.0 在 java.lang.annotation 包中提供了四个注解,它们仅在编写注解时使用:
现在,注解定义中包含了什么?注解只支持基本类型、字符串和枚举。注解的所有属性都定义为方法,并且还可以提供默认值。 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @interface Todo { public enum Priority {LOW,MEDIUM,HIGH} public enum Status {STARTED,NOT_STARTED} String author() default "Yash"; Priority priority() default Priority.LOW; Status status() default Status.NOT_STARTED; } 以下是如何使用上述注解的示例: @Todo(priority = Todo.Priority.MEDIUM,author = "Yashwant",status = Todo.Status.STARTED) public void incompleteMethod1() { //Some business logic is written //But it’s not complete yet } 如果注解中只有一个属性,则应该将其命名为 “value”,并且可以在使用时不使用属性名称。 @interface Author{ String value(); } @Author("Yashwant") public void someMethod() { } 目前为止一切顺利。我们已经定义了自定义注解,并将其应用于一些业务逻辑方法。现在,是时候写一个消费的实例了。为了完成这个目标,我们需要使用到反射。如果您熟悉反射代码,那么您就知道反射提供了类、方法和字段对象。所有这些对象都有一个 Class businessLogicClass = BusinessLogic.class; for(Method method : businessLogicClass.getMethods()) { Todo todoAnnotation = (Todo)method.getAnnotation(Todo.class); if(todoAnnotation != null) { System.out.println(" Method Name : " + method.getName()); System.out.println(" Author : " + todoAnnotation.author()); System.out.println(" Priority : " + todoAnnotation.priority()); System.out.println(" Status : " + todoAnnotation.status()); } } 4. 注解用例注解非常的强大,Spring 和 Hibernate 等框架非常广泛地使用注解进行日志记录和验证。注解可以在使用标记接口的地方使用。标记接口用于整个类,但您可以定义可以用于单个方法的注解,例如,某个方法是否公开为服务方法。 在 servlet 3.0 规范中,引入了许多注解,特别是与 servlet 安全有关的注解。我们先来看看几个:
5. 应用程序开发框架(ADF,Application Development Framework)和注解现在,我们正在讨论的最后一部分:应用程序开发框架(ADF)。ADF 由 Oracle 开发,用于构建 Oracle 融合应用程序。我们已经看到了优点和缺点,并且知道如何编写自定义注解,但是在 ADF 中我们可以在哪里使用自定义注解呢?ADF 是否提供本地注解? 这些无疑是有趣的问题:但是是否存在某些限制来阻止在 ADF 中大规模使用注解?前面提到的框架(如 Spring 和 Hibernate ) 使用的 AOP (面向方面的编程)。在 AOP 中,框架提供了为任何事件的预处理和后处理注入代码的机制。例如,您有一个钩子在方法执行之前和之后放置代码,因此您可以在这些地方编写自定义代码。ADF 不使用 AOP。如果我们有任何有效的注解用例,我们可能需要通过继承方式。9月福利,关注公众号 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |