美文网首页
Java基础 (19) 注解

Java基础 (19) 注解

作者: perry_Fan | 来源:发表于2019-02-20 21:37 被阅读0次
一.定义

一种标识 / 标签

二.作用

面向 编译器 / APT 使用

  1. APT(Annotation Processing Tool):提取 & 处理 Annotation 的代码
  2. 因为当开发者使用Annotation 修饰类、方法、方法 等成员后,这些 Annotation 不会自己生效,必须由开发者提供相应的代码来提取并处理 Annotation 信息。这些处理提取和处理 Annotation 的代码统称为 APT
三. 应用场景:
1. 测试代码

如出名的测试框架JUnit = 采用注解进行代码测试

public class ExampleUnitTest {
    @Test
    public void Method() throws Exception {
          ...
    }
}
// @Test 标记了要进行测试的方法Method() 
2. 简化使用 & 降低代码量

如 Http网络请求库 Retrofit & IOC 框架ButterKnife

<-- Http网络请求库 Retrofit -->

// 采用 注解 描述 网络请求参数
public interface GetRequest_Interface {

 @GET("ajax.php?a=fy&f=auto&t=auto&w=hello%20world")
    Call<Translation> getCall();

 }

<-- IOC 框架ButterKnife -->
public class MainActivity extends AppCompatActivity {
// 通过注解设置资源
    @BindView(R.id.test)
    TextView mTv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ButterKnife.bind(this);
    }
}

三. 注解的类型

包括:元注解 、 Java内置注解 & 自定义注解。


1. 元注解

1)@Retention
定义:保留注解
作用:解释 / 说明了注解的生命周期

// 元注解@Retention(RetentionPolicy.RUNTIME)的作用:说明 注解Perry_Annotation的生命周期 = 保留到程序运行时 & 被加载到 JVM 中
@Retention(RetentionPolicy.RUNTIME)
public @interface Perry_Annotation {
}

<-- 元注解@Retention参数说明 -->
// RetentionPolicy.RUNTIME:注解保留到程序运行时 & 会被加载进入到 JVM 中,所以在程序运行时可以获取到它们
// RetentionPolicy.CLASS:注解只被保留到编译进行时 & 不会被加载到 JVM 
// RetentionPolicy.SOURCE:注解只在源码阶段保留 & 在编译器进行编译时将被丢弃忽视。

2) @Documented
定义:Java文档注解
作用:将注解中的元素包含到 Javadoc文档中

// 元注解@Documented作用:说明 注解Carson_Annotation的元素包含到 Javadoc 文档中
@Documented
public @interface Carson_Annotation {
}

3) @Target
定义:目标注解
作用:限定了注解作用的目标范围,包括类、方法等等

// 元注解@Target作用:限定了注解Carson_Annotation作用的目标范围 = 方法
// 即注解Carson_Annotation只能用于解释说明 某个方法
@Target(ElementType.METHOD)
public @interface Carson_Annotation {
}

<-- @Target取值参数说明 -->
// ElementType.PACKAGE:可以给一个包进行注解
// ElementType.ANNOTATION_TYPE:可以给一个注解进行注解
// ElementType.TYPE:可以给一个类型进行注解,如类、接口、枚举
// ElementType.CONSTRUCTOR:可以给构造方法进行注解
// ElementType.METHOD:可以给方法进行注解
// ElementType.PARAMETER 可以给一个方法内的参数进行注解
// ElementType.FIELD:可以给属性进行注解
// ElementType.LOCAL_VARIABLE:可以给局部变量进行注解

4)@Inherited
定义:继承注解
作用:使得一个 被@Inherited注解的注解 作用的类的子类可以继承该类的注解

// 元注解@Inherited 作用于 注解Carson_Annotation
@Inherited
public @interface Carson_Annotation {
}


// 注解Carson_Annotation 作用于A类
@Carson_Annotation
public class A {
  }

// B类继承了A类,即B类 = A类的子类,且B类没被任何注解应用
// 那么B类继承了A类的注解 Carson_Annotation
public class B extends A {}

5)@Repeatable
定义:可重复注解
作用:使得作用的注解可以取多个值

// 1. 定义 容器注解 @ 职业
public @interface Job {
    Person[]  value();
}
<-- 容器注解介绍 -->
// 定义:本身也是一个注解
// 作用:存放其它注解
// 具体使用:必须有一个 value 属性;类型 = 被 @Repeatable 注解的注解数组
// 如本例中,被 @Repeatable 作用 = @Person ,所以value属性 = Person []数组

// 2. 定义@Person 
// 3. 使用@Repeatable 注解 @Person
// 注:@Repeatable 括号中的类 = 容器注解
@Repeatable(Job.class)
public @interface Person{
    String role default "";
}

// 在使用@Person(被@Repeatable 注解 )时,可以取多个值来解释Java代码
// 下面注解表示:Carson类即是产品经理,又是程序猿
@Person(role="coder")
@Person(role="PM")
public class Carson{

}
2. Java内置的注解
3.自定义注解

结合应用上述内容。

相关文章

网友评论

      本文标题:Java基础 (19) 注解

      本文链接:https://www.haomeiwen.com/subject/amhyeqtx.html