Java 注解用法

1、简述

Annontation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) 与程序元素(类、方法、成员变量等)进行关联。

Annontation像一种修饰符样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。

2、基本Annontation

java提供五个基础的annontation类型

@Override

此注解作用于方法,作用于此方法的注解,意味此方法受重写规则的约束,否则不能编译成功

@Deprecated

作用于方法,标注此方法过时

@SuppressWarnings

对于某些不想看到的警告信息,可以通过这个注解来屏蔽

@SafeVarargs

抑制类型转换异常的警告信息,只能用在参数长度可变的方法或构造方法上,且方法必须声明为static或final,否则会出现编译错误。一个方法使用@SafeVarargs注解的前提是,开发人员必须确保这个方法的实现中对泛型类型参数的处理不会引发类型安全问题。

@FunctionalInterface

Java 8为函数式接口引入的一个新注解,主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。保证该接口只能包含一个抽象方法

3、自定义注解

4、getAnnotation方法

获取作用于元素上的单个注解对象

4.1、获取类注解属性值

/**

* 自定义注解

*/

@Retention(RetentionPolicy.RUNTIME)//生命周期

@Target(ElementType.TYPE)//作用范围

public @interface Myannontation {

String value();

}

/**

* 将自定义注解作用在People类

*/

@Myannontation("people")

public class People {

}

/**

* 测试类

*/

public class Test {

public static void main(String[] args) throws ClassNotFoundException {

//获取Class对象

Class peopleClass=Class.forName("com.yl.annontation.People");

//获取注解

Myannontation myannontation= (Myannontation) peopleClass.getAnnotation(Myannontation.class);

//获取注解值

String value=myannontation.value();

System.out.println(value);

}

}

4.2、获取方法注解属性值

/**

* 自定义注解

*/

@Retention(RetentionPolicy.RUNTIME)//生命周期

@Target(ElementType.METHOD)//作用范围

public @interface Myannontation {

String value();

}

/**

* 将自定义注解作用在show方法

*/

public class People {

@Myannontation("show")

public void show(){}

}

/**

* 测试类

*/

public class Test {

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {

//获取Class对象

Class peopleClass=Class.forName("com.yl.annontation.People");

//获取show方法

Method showMethod=peopleClass.getMethod("show");

//获取注解

Myannontation myannontation= (Myannontation) showMethod.getAnnotation(Myannontation.class);

//获取注解值

String value=myannontation.value();

System.out.println(value);

}

}

4.3、获取属性注解属性值

/**

* 自定义注解

*/

@Retention(RetentionPolicy.RUNTIME)//生命周期

@Target(ElementType.FIELD)//作用范围

public @interface Myannontation {

String value();

}

/**

* 将自定义注解作用在属性

*/

public class People {

@Myannontation("name")

public String name;

}

/**

* 测试类

*/

public class Test {

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException {

//获取Class对象

Class peopleClass=Class.forName("com.yl.annontation.People");

//获取name属性

Field nameField=peopleClass.getField("name");

//获取注解

Myannontation myannontation= (Myannontation) nameField.getAnnotation(Myannontation.class);

//获取注解值

String value=myannontation.value();

System.out.println(value);

}

}

5、getAnnotations方法

获取作用于元素上的所有注解对象,包括父类注解

/**

*自定义注解1

*/

@Retention(value=RetentionPolicy.RUNTIME)//生命周期

@Target({ElementType.METHOD})//作用范围

@interface Anno{

//定义一个成员

String value();

}

/**

*自定义注解2

*/

@Retention(value=RetentionPolicy.RUNTIME)//生命周期

@Target({ElementType.METHOD})//作用范围

@interface Anno2{

//定义一个成员

String value();}

/**

*将自定义注解作用在方法上

*/

class MyTest{

@Anno(value="张三")

@Anno2(value="李四")

public void info(){}

}

public class MainTest {

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {

//获取MyTest类的Class对象

Class myTestCls=(Class) Class.forName("getannotation方法使用.MyTest");

//获取info方法的对象

Method infoM=myTestCls.getMethod("info", null);

//获取作用于元素上的所有注解对象

Annotation[] annotatinArrays=infoM.getAnnotations();

//遍历annotatinArrays

for(Annotation annoObj:annotatinArrays){

if(annoObj instanceof Anno){

System.out.println("注解的元数据值="+((Anno)annoObj).value());

}else if(annoObj instanceof Anno2){

System.out.println("注解的元数据值="+((Anno2)annoObj).value());

}

}}

}

6、isAnnotationPresent方法

此方法判断元素是否作用注解,如果此方法作用于此注解,则返回true,否则返回false

/**

*自定义注解

*/

@Retention(value=RetentionPolicy.RUNTIME)//生命周期

@Target({ElementType.METHOD})//作用范围

@interface Anno{

//定义一个成员

String value();

}

/**

*自定义注解

*/

@Retention(value=RetentionPolicy.RUNTIME)

@Target({ElementType.METHOD})

@interface Anno2{

//定义一个成员

String value();

}

class MyTest{

public void info(){}

public void info2(){}

@Anno(value="张三")

public void info3(){}

}

public class MainTest {

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {

//获取MyTest类的Class对象

Class myTestCls=(Class) Class.forName("getannotation方法使用.MyTest");

//获取info方法的对象

Method infoM=myTestCls.getMethod("info", null);

System.out.println(infoM.isAnnotationPresent(Anno.class));//fasle

}

}

7、getDeclaredAnnotations方法

返回直接存在于此元素上的注解,即不包括从父类继承过来的注解。比较简单理解,不写代码案例了。

8、@Retention

@Retention是Java 1.8 才加进来的,所以算是一个新的特性

Repeatable的英文意思是可重复的。顾名思义说明被这个元注解修饰的注解可以同时作用一个对象多次,但是每次作用注解又可以代表不同的含义。

下面我们看一个人玩游戏的例子

/**一个人喜欢玩游戏,他喜欢玩英雄联盟,绝地求生,极品飞车,尘埃4等,则我们需要定义一个人的注解,他属性代表喜欢玩游戏集合,一个游戏注解,游戏属性代表游戏名称*/

/**玩家注解*/

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.TYPE)

public @interface People {

Game[] value() ;

}

/**游戏注解*/

@Repeatable(People.class)

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.TYPE)

public @interface Game {

String value();

}

/**玩游戏类*/

@Game(value = "LOL")

@Game(value = "PUBG")

@Game(value = "NFS")

@Game(value = "Dirt4")

public class PlayGame {

}

/**

*测试类,获取注解属性值

*/

public static void main(String[] args) throws ClassNotFoundException {

//获取Class对象

Class playClass=Class.forName("com.yl.annontation.PlayGame");

//获取注解

People people= (People) playClass.getAnnotation(People.class);

//获取注解值

Game[] value=people.value();

//输出注解值

System.out.println(Arrays.toString(value));

}

/**

*@Game会存入@People的Game[]中

*@Game必须要有一个属性名为value,@People也是

*/

9、编译时处理Annotation

处于RetentionPolicy.CLASS生命周期的注解信息,如何提取?

问题就是当处理CLASS阶段的注解信息,会在运行期间之前就丢失,因此不能通过运行期间的反射机制提取数据

但是可以通过APT工具,在javac期间提取处于编译时的注解数据信息

具体如何实现

/**

*创建一个处于编译期间的注解

*/

@Retention(RetentionPolicy.CLASS)

@Target(ElementType.TYPE)

public @interface MyAnno {

String value();

}

/**

*注解作用于类

*/

@MyAnno(value="red apple")

public class Apple {}

@SupportedSourceVersion(SourceVersion.RELEASE_8)//设置jdk版本

@SupportedAnnotationTypes("apt.MyAnno") //设置自定义注解

public class MyAnnotationProcess extends AbstractProcessor {

/**

*重写核心方法:注解处理器,当javac调用apt工具触此处理器

*/

@Override

public boolean process(Set extends TypeElement> annotations, RoundEnvironment roundEnv){

//获取根节点信息

for (Element rootElement : roundEnv.getRootElements()) {

//如果此根节点标注注解信息并且属于类

if(rootElement.getKind()== ElementKind.CLASS) {

//获取注解类对象

MyAnno annTest=rootElement.getAnnotation(MyAnno.class);

if(annTest!=null) {

System.out.println("将编译时的注解元 数据提取="+annTest.value());

}

}

}

return false;

}

}

如何通过apt编译

javac -d . MyAnnotationProcess.java

javac -d . *.java -processor apt.MyAnnotationProcess

最终输出结果

java 注解使用_Java 注解用法相关推荐

  1. java注解机制_Java 注解机制

    一.注解中的信息已经在Class中了,我们应该如何读取出来 1 java.lang.reflect.AnnotatedElement接口:2 3 publicAnnotation[] getAnnot ...

  2. Java注解 编译_Java注解(3)-注解处理器(编译期|RetentionPolicy.SOURCE)

    注解的处理除了可以在运行时通过反射机制处理外,还可以在编译期进行处理.在编译期处理注解时,会处理到不再产生新的源文件为止,之后再对所有源文件进行编译. Java5中提供了apt工具来进行编译期的注解处 ...

  3. java uv实例_Java注解的实际应用案例讲解

    前言 注解确实是一个很强大的功能,是的开发效率大幅度提高.在Android开发中,比较有名气的注解框架当属:Butterknife.https://github.com/JakeWharton/but ...

  4. java 反射 注解 运用_Java注解与反射的使用

    打开 Eclipse,新建 Java 项目"注解与反射",在 src 下右键并建立包 "注解与反射",在包下右键并建立 Annotation (注解)文件,名称 ...

  5. java 注解学习_java注解的学习

    package package3; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; im ...

  6. Java注解库_Java 注解详解

    本文部分摘自 On Java 8 基本语法 注解是 Java 5 所引入的众多语言变化之一,是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影 ...

  7. java注解编程_java 注解 基本原理 编程实现

    java 1.5开始引入了注解和反射,正确的来说注解是反射的一部分,没有反射,注解无法正常使用,但离开注解,反射依旧可以使用,因此来说, 反射的定义应该包含注解才合理一些.当然,这只是个人想法,至于j ...

  8. java method 注释_Java注解

    Java注解 注解概述 3.注解 3.1.注解,或者叫做注释类型,英文单词是:Annotation 疑问:注解到底是干啥的????????? 3.2.注解Annotation是一种引用数据类型.编译之 ...

  9. java注解类型_Java注解类型

    本篇文章帮大家学习java注解类型,包含了Java注解类型使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. 标记注解类型 标记注解类型是没有元素的注解类型,甚至没有默认值. ...

最新文章

  1. 【Smart_Point】动态内存与智能指针
  2. selenium之窗口操作
  3. 【Oracle】Oracle常用EVENT之三
  4. python数据科学-多变量数据分析
  5. 解决: java.net.ConnectException: Connection refused: connect
  6. 说说 JavaScript 计时器的工作原理
  7. 论文浅尝 | AAAI2020 - 多分量图卷积协同过滤方法
  8. Python项目实战:带领你爬取sexy的福利图片
  9. 搭上信息化火箭,文档管理也要跟上潮流
  10. 工作中遇到的前后台联调的一些规则
  11. java基础中如何中断/阻塞线程和使用中断
  12. 北京1954坐标转为经纬度坐标
  13. h264和h265编码所需要的处理器性能
  14. 机器学习笔记最大熵之NER
  15. 给Android手机设置的壁纸应该是多大尺寸
  16. php7安装fileinfo扩展
  17. 数据分析常用名称、统计分析模型 SUS、CLV、VOC、认知失调、 体验度量
  18. pulp platform 的搭建
  19. 【leetcode】1849. 将字符串拆分为递减的连续值
  20. 引擎系列学习【一】Color Model(颜色模型)

热门文章

  1. 深入了解一下PYTHON中关于SOCKETSERVER的模块-B
  2. 单例模式---设计模式
  3. oracle biee
  4. 终于等到DUDU把MetaBlog Api打开了
  5. MFC获取键盘光标和鼠标光标所在控件的ID
  6. 微信小程序 滚动选项卡 swiper高度自适应
  7. Python连接Mysql数据库入门
  8. Keras和TensorFlow的关系和区别
  9. binlog工具_MySQL5.6新增的参数binlog_row_image到底怎么设置-爱可生
  10. 搜狗输入法电脑版_搜狗输入法就是垃圾!!!大大的垃圾!