专业的JAVA编程教程与资源

网站首页 > java教程 正文

JAVA基础之自定义注解(java自定义注解记录日志)

temp10 2024-09-27 23:01:58 java教程 11 ℃ 0 评论

什么是注解?

注解是一种能被添加到java源代码中的元数据,方法、类参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数、和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。

JAVA基础之自定义注解(java自定义注解记录日志)

申明注解要用到的东西

  • 修饰符:访问修饰符必须为public,不写默认为public
  • 关键字:@interface
  • 注解名称:自定义注解名称,使用的时候会用到
  • 注解类型元素:是注解中的内容,可以理解成自定义接口的实现部分
public @interface MyTarget {
    String name() default "jack";
    boolean flag();
}

JDK中有一些元注解,主要包括@Target、@Retention、@Document、@Inherited用来修饰注解。

@Target

表明该注解可以应用的java元素类型。注解的作用范围,就是注解用在什么地方的

Target类型

描述

ElementType.TYPE

应用于类、接口(包括注解类型)、枚举

ElementType.FIELD

应用于属性(包括枚举中的常量)

ElementType.METHOD

应用于方法

ElementType.PARAMETER

应用于方法地形参

ElementType.CONSTRUCTOR

应用于构造函数

ElementType.LOCAL_VARIABLE

应用于局部变量

ElementType.ANNOTATION_TYPE

应用于注解类型

ElementType.PACKAGE

应用于包

ElementType.TYPE_PARAMETER

1.8版本新增,应用于类型变量

ElementType.TYPE_USE

1.8版本新增,应用于任何使用类型的语句中(例如声明语句、泛型和强制转换语句中的类型)

@Retention

表面该注解的生命周期。注解的级别,就是注解能留存到什么时候

生命周期类型

描述

RetentionPolicy.SOURCE

编译时被丢弃,不包含在类文件中

RetentionPolicy.CLASS

JVM加载时被丢弃,包含在类文件中,默认值

RetentionPolicy.RUNTIME

由JVM 加载,包含在类文件中,在运行时可以被获取到

@Document

表明该注解标记的元素可以被javadoc或类似的工具文档化

@Inherited

表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解

实例

定义注解

// 表明该注解可以应用的java元素类型 TYPE:类/接口/枚举、FIELD:字段/属性
@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyTarget {
    String name() default "jack";
    boolean isDelete() default false;
}

实体类

@Data
// 对外保持private setter,不对外公开属性的写操作
@Builder(toBuilder = true)
@MyTarget(isDelete = true, name = "BigHu")
public class Person {

    private String name;
    private Integer age;
    private boolean isDelete;
}

利用反射解析注解

public class AnnotationTest {

    public static void main(String[] args) {
        // 获取Person的Class对象
        Person person = Person.builder().name("Big.Hu").age(520).isDelete(true).build();
        System.out.println("person对象:" + person.toString());
        Person jack = person.toBuilder().age(20).name("jack").build();
        System.out.println("jack: " + jack.toString());
        Class<? extends Person> clazz = person.getClass();
        /**
         * isAnnotationPresent:判断当前元素是否被指定注解修饰
         * getAnnotation:返回指定的注解
         * getAnnotations:返回所有的注解
         */
        // 判断person对象上是否有MyTarget注解
        if (clazz.isAnnotationPresent(MyTarget.class)) {
            System.out.println("Person类上配置了MyTarget注解");
            MyTarget target = clazz.getAnnotation(MyTarget.class);
            System.out.println("person.name: " + target.name() + ",person.isDelete: " + target.isDelete());
        } else {
            System.out.println("Person类上没有配置MyTarget注解");
        }
    }
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表