您的位置:首页 > 编程语言 > Java开发

燃烧吧!!!Annotation,注解

2018-03-15 17:46 246 查看

轻松一下

一直以来每天早上挤公交,都能看到同一个妹子,这几天看不见了,心里空唠唠的,好容易在广场遇见了,就鼓起勇气问她,这几天都看不见你挤公交,是不是买车了?

妹子突然神色紧张,一脸戒备——咋滴?你想搭顺风车啊?我。。。

零、认识单词!

Annotation [ˌænə’teɪʃn]:注解

transient [ˈtrænziənt]:临时的

Retention [rɪˈtɛnʃən] :保留

Target 目标

Inherited 继承

一、什么是注解(Annotation [ˌænə’teɪʃn])?

注解,那就是元数据,即一种描述数据的数据。所以,可以说注解就是源代码的元数据。比如,下面这段代码:

/**
*spring初始化多线程
*/
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor taskExecutor=new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(30);
taskExecutor.setMaxPoolSize(300);
taskExecutor.setQueueCapacity(500);
taskExecutor.initialize();
return taskExecutor;
}


上面的代码中,我重写了getAsyncExecutor()方法并使用了@Override注解。但是,即使我不使用@Override注解标记代码,程序也能够正常执行。那么,

- 该注解表示什么?

- 这么写有什么好处吗?

- 注解是怎样工作的,注解的原理是什么?

事实上,@Override告诉编译器这个方法是一个重写方法(描述方法的元数据),如果父类中不存在该方法,编译器便会报错,提示该方法没有重写父类中的方法。如果我不小心拼写错误,例如将getAsyncExecutor()写成了getAsyncExecutors(){…},而且我也没有使用@Override注解,那程序依然能编译运行。但运行结果会和我期望的大不相同。现在我们了解了什么是注解,并且使用注解有助于阅读程序。

Annotation是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。它是一种由JSR-175标准选择用来描述元数据的一种工具。

二、为什么要引入注解?

代码和注解能够紧紧的耦合在一起(之前使用的是XML)!

Annotation定义了一种标准的描述元数据的方式。

目前,许多框架将XML和Annotation两种方式结合使用,平衡两者之间的利弊。

三、Annotation是如何工作的?怎么编写自定义的Annotation?

对于@Override注释你可能有些疑问,它什么都没做,那它是如何检查在父类中有一个同名的函数呢。@Override注解的定义不仅仅只有这么一点代码。这部分内容很重要,我不得不再次重复:Annotations仅仅是元数据,和业务逻辑无关。理解起来有点困难,但就是这样。如果Annotations不包含业务逻辑,那么必须有人来实现这些逻辑。元数据的用户来做这个事情。Annotations仅仅提供它定义的属性(类/方法/包/域)的信息。Annotations的用户(同样是一些代码)来读取这些信息并实现必要的逻辑。当我们使用Java的标注Annotations(例如@Override)时,JVM就是一个用户,它在字节码层面工作。到这里,应用开发人员还不能控制也不能使用自定义的注解。因此,我们讲解一下如何编写自定义的Annotations。

1.@Documented –注解是否将包含在JavaDoc中

2.@Retention –什么时候使用该注解

3.@Target? –注解用于什么地方

4.@Inherited – 是否允许子类继承该注解

ElementType.TYPE:用于描述类、接口或enum声明
ElementType.FIELD:用于描述实例变量
ElementType.METHOD
ElementType.PARAMETER
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.ANNOTATION_TYPE 另一个注释
ElementType.PACKAGE 用于记录java文件的package信息


我们来逐个讲述编写自定义Annotations的要点。上面的例子中,你看到一些注解应用在注解上。

J2SE5.0版本在 java.lang.annotation提供了四种元注解,专门注解其他的注解:

写一个Todo注解:

/**
* 第一个注解
* @author <zj>
*2018年3月15日下午4:23:49
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Todo {
public enum Priority {LOW,MEDIUM,HIGH}
public enum Start {YES, NO}
String Auth() default "zj";
Priority priority() default Priority.MEDIUM;
Start start()  default Start.NO;

}


利用反射遍历调用了Todo注解的方法:

@Todo
public void test() {}
public static void main(String[] args) {
Class<?>  uClass = UserController.class;
for (Method method:uClass.getMethods()) {
Todo anTodo = method.getAnnotation(Todo.class);
if (anTodo != null) {
System.out.println(anTodo.start);
System.out.println(anTodo.Auth());
}
}
}


严肃一下!

罗斯福在美国经济大萧条说:并非追求利润的自由企业制度已在这儿失败,相反,是他尚未经受考验!

<大败局>_吴晓波

参考

http://www.importnew.com/10294.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring annotation