日记大全

日记大全 > 句子大全

一句话概述什么是注解(包工头都能听得懂)

句子大全 2016-04-28 02:21:59
相关推荐

注解就是一个标签,在我们的代码中使用注解就相当于给代码打上标签。

注解的创建

注解是Java 5.0版本开始引入的概念,注解和类或者接口一样,也属于一种类型。注解的定义如下:

public @interface AnnotationA {} 和接口的定义很类似,在interface前面加上一个@符号即可。

通过上面定义的AnnotationA注解,也就可以理解为创建了一个名为AnnotationA的标签。

注解的应用

我们在上面创建了一个AnnotationA的标签,那么接下来该如何在代码中使用这个标签呢?

注解可以使用在类、属性和方法上,举例如下:

@AnnotationApublic class Test { @AnnotationA private String str; @AnnotationA public String methodA(){ }}通过上面的举例,相当于给类Test打上了一个AnnotationA的标签,同时也给Test的属性str和方法methodA打上了一个AnnotationA的标签。

这时只是给类、属性和方法打上了标签,但是要想让这个标签起作用,那还得需要一个元注解才能生效。

元注解

元注解就是注解在注解上的注解。有点绕,简单来说就在创建注解的时候给你要创建的注解打上一个标签,那这个标签就叫做元注解。

元注解是Java官方定义好的,元注解有@Retention、@Documented、@Target、@Inherited、@Repeatable 这5种。

1. Retention的英文意为保留期的意思。当@Retention应用到一个注解上的时候,它解释说明了这个注解的存活时间。意思就是表示这个注解生效的时间范围。

它的取值如下:

RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。@Retention(RetentionPolicy.RUNTIME)public @interface AnnotationA {} 上面的声明表示AnnotationA这个标签在代码运行期间可以被获取到,因此它的生命周期非常长。

2.Documented这个元注解肯定是和文档有关。它的作用是能够将注解中的元素包含到 Javadoc 中去。

3.Target目标的意思,指定这个注解作用的目标是哪里。使用Target可以限定注解的使用场景,比方说限定这个注解制定使用在类上,或者限定只能使用在属性或方法上。

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface AnnotationA {} 上面的例子就限定了AnnotationA这个注解只能使用在类、接口、枚举上。

Target的取值:

ElementType.ANNOTATION_TYPE 可以给一个注解进行注解ElementType.CONSTRUCTOR 可以给构造方法进行注解ElementType.FIELD 可以给属性进行注解ElementType.LOCAL_VARIABLE 可以给局部变量进行注解ElementType.METHOD 可以给方法进行注解ElementType.PACKAGE 可以给一个包进行注解ElementType.PARAMETER 可以给一个方法内的参数进行注解ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举4.Inherited 继承的意思,简单理解就是一个注解如果被Inherited注解了,当这个注解使用在类A上,再创建一个类B去继承类A,那么类B也同样具有了这个注解。

简单说就是,Inherited可以使类上的注解具有父子传递性。

@Inherited@Retention(RetentionPolicy.RUNTIME)public @interface Test {}@Testpublic class A {}public class B extends A {}注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。

5.Repeatable可重复,@Repeatable 是 Java 1.8 才加进来的,所以算是一个新的特性。

举个例子,一个人他既是程序员又是产品经理,同时他还是个画家。

public @interface Persons { Person[] value();}@Repeatable(Persons.class)public @interface Person{ String role default "";}@Person(role="artist")@Person(role="coder")@Person(role="PM")public class SuperMan{}注解的属性

注解的属性也叫做成员变量。注解只有成员变量,没有方法。

看看在注解中如何创建成员变量:

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface AnnotationA { int id(); String msg();}在使用注解时给成员变量赋值如下:

@AnnotationA(id=3,msg="hello annotation")public class Test {}需要注意的是,在注解中定义属性时它的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组。

注解中属性可以有默认值,默认值需要用 default 关键值指定。

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface AnnotationA { public int id() default -1; public String msg() default "Hi";}另外,还有一种情况。如果一个注解内仅仅只有一个名字为 value 的属性时,应用这个注解时可以直接接属性值填写到括号内。

public @interface AnnotationA { String value();}@AnnotationA("hello annotation")public class Test {}注解与反射

注解通过反射获取。首先可以通过 Class 对象的 isAnnotationPresent() 方法判断它是否应用了某个注解.

public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}然后通过 getAnnotation() 方法来获取 Annotation 对象。

public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {}或者是 getAnnotations() 方法。

public Annotation[] getAnnotations() {}举例如下:

@TestAnnotation()public class Test { public static void main(String[] args) { boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class); if (hasAnnotation) { TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class); System.out.println("id:"+testAnnotation.id()); System.out.println("msg:"+testAnnotation.msg()); } }}注解的使用场景

回到前面我们说的注解就相当于一个标签,当我们在代码中使用注解的时候就相当于给代码打上了一个标签。当我们给代码打上标签之后,这个标签是不会自动工作的,必须由我们开发者提供相应的代码来提取并处理这些标签的信息,而这个处理标签信息的代码我们就称为APT(Annotation Processing Tool)。

像我们在Spring框架中使用到的**@Service、@Controller、@Value**这些注解,在Spring框架中就提供了相对应的APT来提取和处理这些注解信息。

本文关于注解的知识点就写到这里,也只是抛砖引玉,关于对注解更多的理解或者知识点欢迎大家在评论区留言。

2020.03.17晚.

下节讲反射。

阅读剩余内容
网友评论
相关内容
拓展阅读
最近更新