官方定义:java
Java 注解用于为 Java 代码提供元数据。做为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上能够用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。数组
元注解定义bash
元注解的做用就是负责注解其余注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型做说明。Java5.0定义的元注解ide
对于注解的跟人理解。举个不恰当的比喻,注解就比如现实的标签。好比高富帅标签,那么元注解就是具体来注解规范这个高富帅标签的内容。好比经过元注解规定这个高富帅标签只能给人使用,动物则不行。好比这个标签只对成年人有效,小孩子会自动忽略等。post
Retention 的英文意为保留期的意思。当 @Retention 应用到一个注解上的时候,它解释说明了这 个注解的的存活时间。 它的取值以下:性能
这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码ui
因为不一样注解使用的时间是不一样的,好比动态注解是在运行时获取注解进行相应操做的,静态注解则在编译的时候。因此要精细划分注解的保留时间就须要这个元注解。使用以下:spa
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
}
复制代码
这个元注解确定是和文档有关。它的做用是可以将注解中的元素包含到 Javadoc 中去code
@Target 指定了注解运用的地方。就看该标签是运用到类仍是说方法仍是说其余某些地方。 具体@Target取值有继承
Inherited 是继承的意思,可是它并非说注解自己能够继承,而是说若是一个超类被 @Inherited 注解过的注解进行注解的话,那么若是它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test {}
@Test
public class A {}
public class B extends A {}
复制代码
注解 Test 被 @Inherited 修饰,以后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。
Java 默认带了一些注解,平时开发的时候其实也已经在默默使用了。
该注解用来标记过期的元素,若某个类或者方法或者元素等被标记了,那么别的引用到那处代码的地方会出现划线,进行标示,提醒使用者,这个代码已通过时,使用要慎重。
@Deprecated
public void stopPullLoading() {
}
复制代码
java.lang.Override 是一个marker annotation类型,它被用做标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的做用。若是咱们使用了这种annotation在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
复制代码
此注解能告诉Java编译器关闭对类、方法及成员变量的警告。 SuppressWarning不是一个marker annotation。它有一个类型为String[]的成员,这个成员的值为被禁止的警告名。对于javac编译器来说,被-Xlint选项有效的警告名也一样对@SuppressWarings有效,同时编译器忽略掉没法识别的警告名。
@SuppressWarnings(value={"unchecked","fallthrough"})
public void lintTrap() { /* sloppy method body omitted */ }
复制代码
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其余细节。在定义注解时,不能继承其余的注解或接口。@interface用来声明一个注解,其中的每个方法其实是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。能够经过default来声明参数的默认值。
注解参数的可支持数据类型:
Annotation类型里面的参数该怎么设定: 第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型; 第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String; 第三,若是只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。
简单的自定义注解和使用注解实例:
package annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 水果名称注解
* @author wangsheng
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
String value() default "";
}
复制代码
我的开发时注解的做用:
通常在运行时反射获取到注解的内容,而后进行相应的操做,好比绑定id等。 参考了解:juejin.im/post/5c21fe…
须要使用到APT,在代码编译阶段根据注解完成相应代码的添加,因为在编译阶段完成了相关工做,因此影响比动态注解小,性能更好。
(留坑接下来写文章填)