java成神之——注释修饰符

  • 注释修饰符

    • 自定义注释

      • 元注释
      • 通过反射在runtime访问注释
    • 内置注释
    • 多注释实例
      • 错误写法
      • 使用容器改写
      • 使用@Repeatable元注释
    • 注释继承
    • 使用反射获取注释
      • 获取类的注释
      • 获取方法的注释
    • 结语

注释修饰符

自定义注释

元注释

用来注释自定义注释的注释

@Target 限定注释允许加载的目标
    @Target(ElementType.METHOD)                     只能用于方法
    @Target({ElementType.FIELD, ElementType.TYPE})  可以用于字段和类型

    ANNOTATION_TYPE                                 注解其他的注释
    CONSTRUCTOR                                     注解构造函数
    FIELD                                           注解字段和枚举常量
    LOCAL_VARIABLE                                  注解局部变量
    PACKAGE
    METHOD                                          注解方法
    PARAMETER                                       注解方法参数
    TYPE                                            注解class,interface,enum
    TYPE_PARAMETER                                  注解泛型参数
    TYPE_USE                                        注解强转类型

@Retention 设置注解在程序runtime时期能否被反射访问到
    @Retention(RetentionPolicy.RUNTIME)             运行反射访问

    CLASS                                           值运行在class文件中访问,而不是runtime
    RUNTIME
    SOURCE                                          能够在compiletime配访问到,但是不会添加到class文件中

@Documented 让文档生成器能够识别

@Inherited 这个注释用来改变注释查询方式,从而只用来检查父类,直到发现目标

@Repeatable 多个注释实例能够被附加到注释目标

通过反射在runtime访问注释

声明注释
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MyAnnotation {
    String param1() default "someValue";
    boolean param2() default true;
    int[] param3() default {};
}

使用注释
@MyAnnotation
public static void Test() throws Exception {
    Annotation[] annotationsByType = MyAnnotation.class.getAnnotations();
    System.out.println("----------" + Arrays.toString(annotationsByType));
}

内置注释

@Override                           重写父类方法
@Deprecated                         废弃api
@SuppressWarnings("unchecked")      取消系统的某些警告信息,尽量少用
@SafeVarargs                        抑制可变参数警告
    @SafeVarargs
    public static<T> void Test(T... lists) throws Exception {
    }
@FunctionalInterface                用来声明函数式接口,也就是只能包含一个方法
    @FunctionalInterface
    public interface Test<T> {
        boolean test(T t);
    }

多注释实例

错误写法

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface MyAnnotation1 {
    String param();
}

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2 {
    String param() default "someValue";
}

报错
@MyAnnotation1(param="someValue")
@MyAnnotation1(param="someValue") 

使用容器改写

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface MyAnnotation1 {
    String param();
}

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2 {
    MyAnnotation1[] param();
}

@MyAnnotation2(param={
    @MyAnnotation1(param="someValue1"),
    @MyAnnotation1(param="someValue2"),
})

获取注释的值
MyAnnotation1[] MyAnnotations = TestController.class.getAnnotation(MyAnnotation2.class).param();

for (MyAnnotation1 item : MyAnnotations) {
    System.out.println(item.param());
}

使用@Repeatable元注释

@Repeatable(MyAnnotation2.class)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation1 {
    String value();
}

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2 {
    MyAnnotation1[] value();
}

@MyAnnotation1(value="someValue1")
@MyAnnotation1(value="someValue2")

获取注释值

MyAnnotation1[] MyAnnotations = TestController.class.getAnnotationsByType(MyAnnotation1.class);
for (MyAnnotation1 item : MyAnnotations) {
    System.out.println(item.value());
}

注释继承

添加了@Inherited,继承的子类可以访问父类的注释

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation1 {
    String value();
}

@MyAnnotation1(value="someValue1")
class Father {

}

public class Test extends Father{
    MyAnnotation1[] MyAnnotations = Test.class.getAnnotationsByType(MyAnnotation1.class);
    for (MyAnnotation1 item : MyAnnotations) {
        System.out.println(item.value());
    }
}

使用反射获取注释

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation1 {
    String value();
}

获取类的注释

@MyAnnotation1(value="someValue1")
public class Test{}

MyAnnotation1 annotation = Test.class.getAnnotation(MyAnnotation1.class);
System.out.println(annotation.value());

获取方法的注释

@MyAnnotation1(value="someValue1")
public Object Test() throws Exception {}

Method method = TestController.class.getMethod("Test", null);
MyAnnotation1 annotation = (MyAnnotation1)method.getAnnotation(MyAnnotation1.class);
System.out.println(annotation.value());

结语

本文章是java成神的系列文章之一

如果你想知道,但是本文没有的,请下方留言

我会第一时间总结出来并发布填充到本文

原文地址:https://www.cnblogs.com/ye-hcj/p/9745758.html

时间: 2024-08-30 00:39:51

java成神之——注释修饰符的相关文章

Java语言中的-----访问修饰符

day04 Java语言中的----访问修饰符 一.访问修饰符概述: 访问修饰符就是对变量或者是方法或者是类的一个修饰,通过修饰以后实现一些必要的权限,主要是说明类成员如何被使用的作用. 二.访问修饰符 1.访问修饰符有哪些? 访问修饰符总共有8种,本文只先给大家说static和final两个修饰符 1.1.final.修饰常量的 1.2.static.修饰静态的 1.3.abstract. 1.4.native. 1.5.sysnchronized.修饰线程的 1.6.transient. 1

Java杂谈之类的访问修饰符及其他注意点知识

package JavaObject; public class Person { //hand为内部类,内部类的访问修饰符可以任意 //private class hand{} public String name; //protected访问修饰符,对于同一个包或者子类是可以访问到的 protected int sex; //缺省对同一个包或继承子类是可以访问到的但是同一个包里面的子类就访问不到 int age; //私有,Person自己才能访问 private double money;

java成神之——java中string的用法

java中String的用法 String基本用法 String分割 String拼接 String截取 String换行符和format格式化 String反转字符串和去除空白字符 String获取指定位置字符和replace的使用 StringBuffer的使用 字符串转换 基本类型的转换 添加字符编码 Base64的编码和解码 结语 java中String的用法 String基本用法 字符串一旦创建在堆中就不可变 字符串声明 String str = "你好"; String s

java成神之——正则表达式基本使用

正则表达式 常用匹配规则 基本使用 标记符的使用 部分正则标记 正则表达式在字符串方法中的使用 结语 正则表达式 常用匹配规则 [abc] abc其中一个 [^abc] abc之外的一个 [a-z] a和z之间的一个 . 表示任意字符 \d 表示一个数字 \D 非数字 \w 表示a-zA-Z0-9_ \W 非a-zA-Z0-9_ ^ 开头 $ 结尾 \b 英文单词边界 ? 一次或者0次 * 零次或者多次 + 一次或者多次 {n} 出现制定n次 {n,} 至少n次 {n,m} >=n <=m 次

2016,Java成神初年

时间2016.12.31 01:51 地点K9004 5号车厢 1号下铺 此刻 深夜 不眠 回想 反思 规划! 工作快四年了,每年经历不同,心思不同!2013,从学生到职场人的转变,在长沙工作半年,第一感觉轻松和新鲜!但我觉得长沙不适合我,我要离开,所以告诉自己我要去深圳!2014,年初八杀入深圳,开始自己的苦逼人生,来到创业公司,各种加班,各种出差.2014最大收获是交了媳妇.2015,坑爹一年,心浮躁了,没有好好学习,工作很忙,各种加班,进步很小,年底感觉不能在呆了.2016,年初9立马辞职

Java语言中的权限修饰符

1.Java语言中的权限修饰符主要包括private,public ,default , protected ,这些修饰符控制着对类和类的成员变量以及成员方法的访问. 用权限修饰符修饰变量时的语法格式: puclic 类型  属性0; private 类型 属性1; private 类型 属性2; 类型 属性3;(default权限修饰符一般不写) 如果一个类的成员变量被修饰为private的时候,则该成员变量只能在本类中使用,在子类中是不可见的.如果非要调用,通过get/set方法就可以获取.

java成神之——enum枚举操作

枚举 声明 枚举遍历 枚举在switch中使用 枚举比较 枚举静态构造方法 使用类来模拟枚举 枚举中定义抽象方法 枚举实现接口 单例模式 使用静态代码快 EnumSet EnumMap 结语 枚举 声明 基本使用 public enum ChineseNumber { YI, ER, SAN, SI } ChineseNumber.values(); // ["YI","ER","SAN","SI"] 枚举遍历 for (Ch

java成神之——properties,lambda表达式,序列化

Properties 加载defaults.properties文件 写Properties到xml文件 读Properties从xml文件 Lambda表达式 自定义 内置 sort方法中使用Lambada 序列化 文件序列化 Gson序列化 Jackson序列化 Comparable和Comparator Comparable对象排序 Comparator对象排序 结语 Properties 加载defaults.properties文件 defaults.properties内容如下 la

java成神之——Stream和Optional

Stream流 基本使用 流关闭 平行流 流重用 iterator转换成流 分组计数 无限流 流转集合 压缩流 统计数值流 集合转换流遍历 流拼接 reduce 使用流生成随机字符串 流的包装流 几种包装流 包装流写字符到文件 加密和压缩数据 Optional Optional的常用方法 Optional的基本使用 原始数据类型 结语 Stream流 基本使用 Stream<String> myStream = Stream.of("a", "", &q