P03 注解

这篇具有很好参考价值的文章主要介绍了P03 注解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系统:Win10
Java:1.8.0_333
IDEA:2020.3.4
Gitee:https://gitee.com/lijinjiang01/JavaWeb

1.注解概述

1.1 什么是注解

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制
Java 语言中的类、构造器、方法、成员变量、参数等都可以被注解进行标注
P03 注解

1.2 注解的作用

对 Java 中类、方法、成员变量做标记,然后进行特殊处理,至于到底做何种处理由业务需求来决定
例如:JUnit 框架中,标记了注解 @Test 的方法就可以被当成测试方法执行,而没有标记的就不能当成测试方法执行

2.自定义注解

2.1 注解格式

自定义注解就是自己做一个注解来使用
P03 注解

特殊属性:
value 属性:如果只有一个 value 属性的情况下,使用 value 属性的时候可以省略 value 名称不写
但是如果由多个属性,且多个属性没有默认值,那么 value 名称是不能省略的

2.2 代码实例

首先写一个注解类 MyBook

public @interface MyBook {
    String name();

    String[] authors();

    double price();
}

再写一个测试类

@MyBook(name = "《水浒传》", authors = {"施耐庵"}, price = 46.0)
public class AnnotationDemo01 {

    @MyBook(name = "《三国演义》", authors = {"罗贯中"}, price = 36.0)
    private String name;

    @MyBook(name = "《西游记》", authors = {"吴承恩"}, price = 40.0)
    public AnnotationDemo01() {
    }

    @MyBook(name = "《红楼梦》", authors = {"曹雪芹"}, price = 46.0)
    public static void main(String[] args) {
        @MyBook(name = "《山海经》", authors = {"徐客"}, price = 43.6)
        int index = 1;
    }
}

3.元注解

3.1 常用元注解

元注解:就是注解注解的注解
常用元注解:
@Target:约束自定义注解的标记范围
@Retention:申明注解的生命周期

3.2 @Target 常用值

@Target 中可使用的值定义在 ElementType 枚举类中,常用如下

说明
CONSTRUCTOR 构造器
FIELD 成员变量
LOCAL_VARIABLE 局部变量
METHOD 成员方法
PARAMETER 方法参数
TYPE 类、接口

3.3 @Retention 常用值

@Retention 中可使用的值定义在 RetentionPolicy 枚举类中,常用值如下:

说明
SOURCE 注解将被编译器丢弃
CLASS 注解作用在源码阶段,字节码文件阶段,但不需要在运行时保留,默认值
RUNTIME 注解作用在源码阶段,字节码文件阶段,运行阶段(开发常用)

4.注解解析

4.1 注解解析相关接口

注解的操作中经常需要进行解析,注解的解析就是判断是否存在注解,存在注解就解析出内容
与注解解析相关的接口:
Annotation:注解的顶级接口,注解都是 Annotation 类型的对象
AnnotatedElement:该接口定义了与注解解析相关的解析方法

方法 说明
Annotation[] getDeclaredAnnotations() 获得当前对象上使用的所有注解,返回注解数组
T getDeclaredAnnotation(Class annotationClass) 根据注解类型获得对应注解对象
boolean isAnnotationPresent(Class annotationClass) 判断当前对象是否使用了指定的注解,如果使用了则返回 true,否则 false

4.2 注解解析的技巧

  1. 注解在哪个成分上,我们就先拿哪个成分对象
  2. 比如注解作用成员方法,则要获取该成员方法对应的 Method 对象,再来拿上面的注解
  3. 比如注解作用再类上,则要该类的 Class 对象,再来拿上面的注解
  4. 比如注解作用在成员变量上,则要获得该成员变量对应的 Field 对象,再来拿上面的注解

4.3 注解解析案例

4.3.1 需求分析

需求:

  1. 定义注解 Book,要求如下
    包含属性:String value() 书名
    包含属性:double price() 价格,默认值为 100
    包含属性:String[] authors() 作者
    限制注解使用的位置:类和成员方法上
    指定注解的有效范围:RUNTIME
  2. 定义 BookStore 类,在类和成员方法上使用 Book 注解
  3. 定义 AnnotationDemo 测试类获取 Book 注解上的数据

4.3.2 代码实例

首先创建 Book 注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Book {
    String value();

    double price() default 100;

    String[] authors();
}

定义使用类 BookStore

@Book(value = "《山海经》", price = 43.6, authors = {"徐客"})
public class BookStore {

    @Book(value = "《西游记》", price = 40.0, authors = {"吴承恩"})
    public void getBook() {

    }
}

定义测试类 AnnotationDemo

import java.lang.reflect.Method;
import java.util.Arrays;

public class AnnotationDemo {
    public static void main(String[] args) {
        // 1.获取class对象
        Class c = BookStore.class;
        // 2.判断是否有Book注解
        if (c.isAnnotationPresent(Book.class)){
            Book book = (Book) c.getDeclaredAnnotation(Book.class);
            System.out.println("========================");
            System.out.print(book.value());
            System.out.print(book.price());
            System.out.println(Arrays.toString(book.authors()));
        }
        Method[] methods = c.getDeclaredMethods();
        for (Method method : methods) {
            Book book = (Book) method.getDeclaredAnnotation(Book.class);
            System.out.println("========================");
            System.out.print(book.value());
            System.out.print(book.price());
            System.out.println(Arrays.toString(book.authors()));
        }
    }
}

4.3.3 运行结果

P03 注解

5.模拟 JUnit 框架

5.1 需求分析

需求:定义若干个方法,只有加了 MyTest 注解,才可以在启动时被触发运行
分析:

  1. 定义一个自定义注解 MyTest,只能注解方法,存活范围时一直都在
  2. 定义若干方法,只有用 @MyTest 注解标注的方法才能在启动时被触发运行

5.2 代码实例

首先定义 MyTest 注解类

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyTest {
}

然后创建方法类 AnnotationDemo

public class AnnotationDemo {

    @MyTest
    public void method01(){
        System.out.println("运行方法method01");
    }

    @MyTest
    public void method02(){
        System.out.println("运行方法method02");
    }

    public void method03(){
        System.out.println("运行方法method03");
    }

    @MyTest
    public void method04(){
        System.out.println("运行方法method04");
    }
}

最后创建运行方法类 RunMethod

import java.lang.reflect.Method;

public class RunMethod {
    public static void main(String[] args) throws Exception {
        AnnotationDemo demo = new AnnotationDemo();
        // 1.获取class对象
        Class c = AnnotationDemo.class;

        // 2.获取所有方法
        Method[] methods = c.getDeclaredMethods();

        // 3.遍历
        for (Method method : methods) {
            // 4.判断是否有MyTest注解
            if (method.isAnnotationPresent(MyTest.class)){
                method.invoke(demo);
            }
        }
    }
}

5.3 运行结果

P03 注解文章来源地址https://www.toymoban.com/news/detail-426013.html

到了这里,关于P03 注解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包