注释修饰符

自定义注释

元注释

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

@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成神的系列文章之一

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

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

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

  1. java成神之——ImmutableClass,null检查,字符编码,defaultLogger,可变参数,JavaScriptEngine,2D图,类单例,克隆,修饰符基本操作

    ImmutableClass null检查 字符编码 default logger 函数可变参数 Nashorn JavaScript engine 执行脚本文件 改变js文件输出流 全局变量 2D图 ...

  2. java成神之——接口,泛型,类

    接口 接口定义 默认方法 函数式接口 泛型 泛型类 泛型类继承 类型限定 泛型方法 泛型接口 类 构造函数 类的继承 抽象类 instanceof运算符 内部类 equals 结语 接口 接口定义 j ...

  3. JAVA基础语法——标识符、修饰符、关键字(个人整理总结)

    JAVA基础语法——标识符.修饰符.关键字 一 . 标识符 1.1    什么是标识符 就是程序员在定义java程序时,自定义的一些名字,例如helloworld 程序里关键字class 后跟的Dem ...

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

    正则表达式 常用匹配规则 基本使用 标记符的使用 部分正则标记 正则表达式在字符串方法中的使用 结语 正则表达式 常用匹配规则 [abc] abc其中一个 [^abc] abc之外的一个 [a-z] ...

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

    java中String的用法 String基本用法 String分割 String拼接 String截取 String换行符和format格式化 String反转字符串和去除空白字符 String获取 ...

  6. java成神之——java常识

    java常识 简单DOS命令 java基础名词 java编译和运行流程 Eclipse常用快捷键 Eclipse相关操作 java基本数据类型 java基本数据类型转换 java常用运算符 java流 ...

  7. Java入门 - 语言基础 - 07.修饰符

    原文地址:http://www.work100.net/training/java-modifier-type.html 更多教程:光束云 - 免费课程 修饰符 序号 文内章节 视频 1 概述 2 访 ...

  8. 转载_2016,Java成神初年

    原文地址:http://blog.csdn.net/chenssy/article/details/54017826 2016,Java成神初年.. -------------- 时间2016.12. ...

  9. Java成神路上之设计模式系列教程之一

    Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在 ...

随机推荐

  1. Ajax基础(二)--获取服务器文件

    获取服务器文件相关步骤: 1.创建文件: 2.创建XMLHttpRequest对象: 3.获取文件(注意事项:1)在服务器中运行测试:2)注意编码问题,编码要统一). 3.1 获取xml文件: HTM ...

  2. 51nod-1385-贪心-构造

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1385 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 ...

  3. 国外DDoS产品的一些调研—— Akamai Arbor Networks Cloudflare DOSarrest F5 Fastly Imperva Link11 Neustar Nexusguard Oracle (Dyn) Radware Verisign

    Global DDoS Threat LandscapeQ4 2017 https://www.incapsula.com/ddos-report/ddos-report-q4-2017.html,D ...

  4. 【转】Symstore 详细使用

    SymStore (symstore.exe) 是用于创建符号存储的工具.它被包含在Windows调试工具包中. SymStore按照某种格式存储符号,使得调试器可以通过时间戳.映像大小(对于.dbg ...

  5. 【2018年全国多校算法寒假训练营练习比赛(第五场)-C】字符串问题(KMP)

    题目链接:https://www.nowcoder.com/acm/contest/77/C [题意] 求一个字符串中最长的子串,要求子串既是原串的前缀又是后缀,除前后缀还在中间出现过. [思路] K ...

  6. Swagger实践和总结

    Swagger学习和实践 最近安装并使用了一下Swagger-ui.Swagger-editor和Swagger-codegen,感觉还不错. Swagger 是一个规范和完整的框架,用于生成.描述. ...

  7. hibernate13--缓存

    <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN&q ...

  8. mysql int(3)与int(11)的区别

    总结,int(M) zerofill,加上zerofill后M才表现出有点点效果,比如 int(3) zerofill,你插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0.如果i ...

  9. 关于socket绑定INADDR_ANY

    其中INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”.“任意地址”. 一般情况下,如果你要建立网络服务器,则你要通知服务器操作系统:请在某地址 xx ...

  10. python 魔法方法补充(__setattr__,__getattr__,__getattribute__)

    python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...