java成神之——注释修饰符
注释修饰符
自定义注释
元注释
用来注释自定义注释的注释
@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成神之——注释修饰符的更多相关文章
- java成神之——ImmutableClass,null检查,字符编码,defaultLogger,可变参数,JavaScriptEngine,2D图,类单例,克隆,修饰符基本操作
ImmutableClass null检查 字符编码 default logger 函数可变参数 Nashorn JavaScript engine 执行脚本文件 改变js文件输出流 全局变量 2D图 ...
- java成神之——接口,泛型,类
接口 接口定义 默认方法 函数式接口 泛型 泛型类 泛型类继承 类型限定 泛型方法 泛型接口 类 构造函数 类的继承 抽象类 instanceof运算符 内部类 equals 结语 接口 接口定义 j ...
- JAVA基础语法——标识符、修饰符、关键字(个人整理总结)
JAVA基础语法——标识符.修饰符.关键字 一 . 标识符 1.1 什么是标识符 就是程序员在定义java程序时,自定义的一些名字,例如helloworld 程序里关键字class 后跟的Dem ...
- java成神之——正则表达式基本使用
正则表达式 常用匹配规则 基本使用 标记符的使用 部分正则标记 正则表达式在字符串方法中的使用 结语 正则表达式 常用匹配规则 [abc] abc其中一个 [^abc] abc之外的一个 [a-z] ...
- java成神之——java中string的用法
java中String的用法 String基本用法 String分割 String拼接 String截取 String换行符和format格式化 String反转字符串和去除空白字符 String获取 ...
- java成神之——java常识
java常识 简单DOS命令 java基础名词 java编译和运行流程 Eclipse常用快捷键 Eclipse相关操作 java基本数据类型 java基本数据类型转换 java常用运算符 java流 ...
- Java入门 - 语言基础 - 07.修饰符
原文地址:http://www.work100.net/training/java-modifier-type.html 更多教程:光束云 - 免费课程 修饰符 序号 文内章节 视频 1 概述 2 访 ...
- 转载_2016,Java成神初年
原文地址:http://blog.csdn.net/chenssy/article/details/54017826 2016,Java成神初年.. -------------- 时间2016.12. ...
- Java成神路上之设计模式系列教程之一
Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在 ...
随机推荐
- 将本地代码提交到gitlub
第一步:建立git仓库 cd到本地项目根路径下面,执行git命令:git init $ git init Initialized empty Git repository in D:/my_wor ...
- 【Hive】窗口函数
我们都知道在sql中有一类函数叫做聚合函数,例如sum().avg().max()等等, 这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的. 但是有时我们想要既显示 ...
- 再论typedef
typedef 定义(或者叫重命名)类型而不是变量 1.类型是一个数据模板,变量是一个实在的数据.类型是不占内存的,而变量是占内存的. 2.面向对象的语言中:类型的类class,变量就是对象. #in ...
- less 应用
链接 变量传入, 实现不同方向的三角形
- 用函数式编程,从0开发3D引擎和编辑器(一)
介绍 大家好,欢迎你踏上3D编程之旅- 本系列的素材来自我们的产品:Wonder-WebGL 3D引擎和编辑器 的整个开发过程,探讨了在从0开始构建3D引擎和编辑器的过程中,每一个重要的功能点.设计方 ...
- windows10 配置apache+php+mysql
apache配置就是个坑!!! 参考win10环境下配置win10Apache+PHP+MySQL环境的方法 注意:把所有"C:/apache2/..."都变为自己的apache目 ...
- 深入理解java虚拟机-第八章
第8章 虚拟机字节码执行引擎 8.2 运行时栈帧结构 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构. 每一个栈帧包括了局部变量表.操作数栈.动态连接.方法返回地址和一 ...
- Auto Layout简单应用——以编码的方式实现Auto Layout自动布局(二)
在上一篇文章iOS学习笔记02——以编码的方式实现Auto Layout自动布局(一)中我们简单的介绍了使用Visual Format Language创建布局约束来实现自动布局,这种方法创建的布局约 ...
- BZOJ3040 最短路(road)
题意 N个点,M条边的有向图,求点1到点N的最短路(保证存在). \(1 \leq N \leq 1000000,1 \leq M \leq 10000000\) 前T条边采用如下方式生成: 初始化x ...
- Oracle Stream配置详细步骤
1 引言 Oracle Stream功能是为提高数据库的高可用性而设计的,在Oracle 9i及之前的版本这个功能被称为Advance Replication.Oracle Stream利用高级队列技 ...