JAVA注解

1.注解的定义

官方定义java

Java 注解用于为 Java 代码提供元数据。做为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上能够用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。数组

1.1元注解

元注解定义bash

元注解的做用就是负责注解其余注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型做说明。Java5.0定义的元注解ide

  1. @Target,
  2. @Retention
  3. @Documented
  4. @Inherited

对于注解的跟人理解。举个不恰当的比喻,注解就比如现实的标签。好比高富帅标签,那么元注解就是具体来注解规范这个高富帅标签的内容。好比经过元注解规定这个高富帅标签只能给人使用,动物则不行。好比这个标签只对成年人有效,小孩子会自动忽略等。post

1.2元注解具体说明

1.2.1 @Retention

Retention 的英文意为保留期的意思。当 @Retention 应用到一个注解上的时候,它解释说明了这 个注解的的存活时间。 它的取值以下:性能

  • RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
  • RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
  • RetentionPolicy.RUNTIME 注解能够保留到程序运行的时候,它会被加载进入到 JVM 中,因此在程序运行时能够获取到它们。

这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码ui

因为不一样注解使用的时间是不一样的,好比动态注解是在运行时获取注解进行相应操做的,静态注解则在编译的时候。因此要精细划分注解的保留时间就须要这个元注解。使用以下:spa

@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
}
复制代码
1.2.2 @Documented

这个元注解确定是和文档有关。它的做用是可以将注解中的元素包含到 Javadoc 中去code

1.2.3 @Target

@Target 指定了注解运用的地方。就看该标签是运用到类仍是说方法仍是说其余某些地方。 具体@Target取值有继承

  • ElementType.ANNOTATION_TYPE 能够给一个注解进行注解
  • ElementType.CONSTRUCTOR 能够给构造方法进行注解
  • ElementType.FIELD 能够给属性进行注解
  • ElementType.LOCAL_VARIABLE 能够给局部变量进行注解
  • ElementType.METHOD 能够给方法进行注解
  • ElementType.PACKAGE 能够给一个包进行注解
  • ElementType.PARAMETER 能够给一个方法内的参数进行注解
  • ElementType.TYPE 能够给一个类型进行注解,好比类、接口、枚举
1.2.4 @Inherited

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 这个注解。

2.预置注解

Java 默认带了一些注解,平时开发的时候其实也已经在默默使用了。

2.1 @Deprecated

该注解用来标记过期的元素,若某个类或者方法或者元素等被标记了,那么别的引用到那处代码的地方会出现划线,进行标示,提醒使用者,这个代码已通过时,使用要慎重。

@Deprecated
    public void stopPullLoading() {
    
    }
复制代码

2.2 @Override

 java.lang.Override 是一个marker annotation类型,它被用做标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的做用。若是咱们使用了这种annotation在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
复制代码

2.3 @SuppressWarnings

此注解能告诉Java编译器关闭对类、方法及成员变量的警告。 SuppressWarning不是一个marker annotation。它有一个类型为String[]的成员,这个成员的值为被禁止的警告名。对于javac编译器来说,被-Xlint选项有效的警告名也一样对@SuppressWarings有效,同时编译器忽略掉没法识别的警告名。

@SuppressWarnings(value={"unchecked","fallthrough"})  
  
public void lintTrap() { /* sloppy method body omitted */ }  
复制代码

3.自定义注解

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其余细节。在定义注解时,不能继承其余的注解或接口。@interface用来声明一个注解,其中的每个方法其实是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。能够经过default来声明参数的默认值。

注解参数的可支持数据类型:

  1. 全部基本数据类型(int,float,boolean,byte,double,char,long,short)
  2. String类型
  3. Class类型
  4. enum类型
  5. Annotation类型 6.以上全部类型的数组

  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 "";  
} 
复制代码

4.注解的做用

我的开发时注解的做用:

  1. 经过注解标注让系统在编译或者运行时来处理某些重复事件,如View的id绑定,点击事件绑定等
  2. 信息收集,好比被注解的类被收集注册到一个集合,以便于监听处理
  3. 其余一些未使用过的功能(接下来想到补充)

5.运行时注解

通常在运行时反射获取到注解的内容,而后进行相应的操做,好比绑定id等。 参考了解:juejin.im/post/5c21fe…

6.编译时注解

须要使用到APT,在代码编译阶段根据注解完成相应代码的添加,因为在编译阶段完成了相关工做,因此影响比动态注解小,性能更好。

(留坑接下来写文章填)

相关文章
相关标签/搜索