深入浅出Java注解 / Java注解是如何工作的?

注:绿色字体表示只是推测,欢迎指正和探讨

         本文从为什么需要Java注解(什么情况下”引入”的这项技术)、什么是Java注解、Java注解的本质是什么以及入门demo示例等方面,带你深入浅出地理解Java注解....

为什么需要注解

       使用Annotation之前(甚至在使用之后),XML被广泛的应用于描述元数据。不知何时开始一些应用开发人员和架构师发现XML的维护越来越糟糕了。他们希望 使用一些和代码紧耦合的东西,而不像XML那样和代码是松耦合的(在某些情况下甚至是完全分离的)代码描述。有趣的是XML配置其实就是为了分离代码和配置引入的。但技术不就都这样吗,一直在寻找一种平衡点!
☞【XML Annotion如何选择】
假如你想为应用设置很多的常量或参数,这种情况下,XML是一个很好的选择,因为它不会同特定的代码相连。如果你想把某个方法声明为服务,那么使用Annotation会更好一些

给java注解下个定义

  用一个词就可以描述注解,那就是元数据,即一种描述数据的数据。所以,可以说注解就是源代码的元数据。Annotation是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。它是一种由JSR-175标准选择 用来描述 元数据的一种工具。

注解的本质

Annotations仅仅是元数据,和业务逻辑无关。理解起来有点困难,但就是这样。如果Annotations不包含业务逻辑,那么必须有人来实现这些逻辑。元数据的"使用者"来做这个事情。 Annotations仅仅提供它定义的属性(类/方法/包/域)的信息。Annotations的"使用者"(同样是一些代码)来读取这些信息并实现必要的逻辑。当我们使用Java的标注Annotations(例如@Override)时, JVM就是一个“使用者”,它在字节码层面工作。mok:" 当我们使用用于Servlet的注解(例如@WebInitParam)时,容器就是一个'使用者';当我们使用框架提供的注解时,框架中的某个组件会负责做读取后的逻辑处理。"

定义自定义注解

  用于描述/定义注解的元注解

@Documented - 是否将注解包含在JavaDoc中
@Retention ([柯林斯]The retention of something is the keeping of it.) - 在什么阶段"保留"(即生效),用于定义注解的生命周期
  • RetentionPolicy.SOURCE – 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
 
  • RetentionPolicy.CLASS – 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。
 
  • RetentionPolicy.RUNTIME– 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。
@Target - 注解用于什么地方
  • ElementType.TYPE:用于描述类、接口或enum声明
  • ElementType.FIELD:用于描述实例变量
  • ElementType.METHOD
  • ElementType.PARAMETER
  • ElementType.CONSTRUCTOR
  • ElementType.LOCAL_VARIABLE
  • ElementType.ANNOTATION_TYPE 另一个注释
  • ElementType.PACKAGE 用于记录java文件的package信息
@Inherited - 是否允许子类继承该注解

    自定义注解的示例

Annotations只支持基本类型、String及枚举类型。注释中的属性以“方法的形式”来定义的,并允许提供默认值。
   
   
@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() {
}
下面我们写一个程序来"读取"我们的注解。所有这些对象都有getAnnotation()这个方法用来返回其所有注解对象,然后我们就可以调用注解对象的方法了。
   
   
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());
}
}

自定义注解的应用场景(待补充)


--------------------------------------------------------------------------

本文是参考如下资源后整理的:

Java中的注解是如何工作的? - ImportNew  (翻译: ImportNew.com 人晓  原文:how-annotations-work-java_idlebrains.org

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值