温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何理解Java注解

发布时间:2021-10-14 10:33:43 来源:亿速云 阅读:138 作者:iii 栏目:web开发

本篇内容介绍了“如何理解Java注解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

由@Autowired引发对注解的思考

我们在编写Spring应用时,会发现通过@Autowired来对成员变量、方法和构造函数进行标注进而实现自动装配的工作,在IDE中点击@Autowired  看其源码会发现里面有更多以@开头的东东,这就是我们今天讲解的重点——Java注解!

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Autowired {     /**      * Declares whether the annotated dependency is required.      * <p>Defaults to {@code true}.      */     boolean required() default true; }

Java 注解详解

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Annotation 是一个辅助类,它在  Junit、Struts、Spring 等工具框架中被广泛使用。Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java  标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容  。当然它也支持自定义Java 标注。

Java 定义了一套内置注解,包括:

@Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。

@Deprecated - 标记过时方法。如果使用该方法,会报编译警告。

@SuppressWarnings - 指示编译器去忽略注解中声明的警告。

作用在其他注解的注解(或者说 元注解)是:

@Retention -  标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。这3个生命周期分别对应于:Java源文件(.java文件)  ---> .class文件 ---> 内存中的字节码。

1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;

2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;

3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;

@Documented - 标记这些注解是否包含在用户文档中。

@Target - 标记这个注解的作用目标是哪种 Java 成员。

@Target(ElementType.TYPE)&mdash;&mdash;接口、类、枚举、注解

@Target(ElementType.FIELD)&mdash;&mdash;字段、枚举的常量

@Target(ElementType.METHOD)&mdash;&mdash;方法

@Target(ElementType.PARAMETER)&mdash;&mdash;方法参数

@Target(ElementType.CONSTRUCTOR) &mdash;&mdash;构造函数

@Target(ElementType.LOCAL_VARIABLE)&mdash;&mdash;局部变量

@Target(ElementType.ANNOTATION_TYPE)&mdash;&mdash;注解

@Target(ElementType.PACKAGE)&mdash;&mdash;包

@Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)

从 Java 7 开始,额外添加了 3 个注解:

@SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。

@FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。

@Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。

自定义注解开发

接下来,我们来学习如何进行自定义注解的开发。

使用@interface方式定义一个注解

import  java.lang.annotation.Retention; import  java.lang.annotation.Target; import  java.lang.annotation.ElementType; import  java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyTag{   String name(); //注解中定义变量name }

写一个类,在方法中应用@MyTag

public class TestTag {      @MyTag(name="case1")      public void login(){          System.out.println("login");      }      @MyTag(name="case2")      public void info(){          System.out.println("info");      }      @MyTag(name="case3")      public void logout(){          System.out.println("logout");      } }

写一个测试类,获取TestTag  类login方法中的@MyTag中的name值。前面我们说了很多注解如何定义,放在哪,现在我们可以开始学习注解属性的提取了,这才是使用注解的关键,获取属性的值才是使用注解的目的。获取注解属性,  需要使用反射技术(我会在下面的文章中重点介绍反射),代码如下:

public static void main(String[] args) throws NoSuchMethodException, SecurityException, ClassNotFoundException {         //装载类并且对其进行实例化的操作。       Class tag = Class.forName("com.my.demo.TestTag");         //调用login方法(必须是public类型)        Method m=tag.getMethod("login");        //返回MyTag类型的注释         MyTag name=m.getAnnotation(MyTag.class);          //输出注释的名称         System.out.println("value is: "+name.name());      }

运行代码,结果如下:

value is: case1

“如何理解Java注解”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI