ToB企服应用市场:ToB评测及商务社交产业平台

标题: Java注解,看完就会用 [打印本页]

作者: 嚴華    时间: 2024-3-16 11:12
标题: Java注解,看完就会用
一、什么是注解

定义:注解(Annotation),也叫元数据。一种代码级别的说明。
它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。
它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
二、内置注解

三、元注解

元注解即注解的注解。
在jdk的中java.lang.annotation包中定义了四个元注解。
@Target

指定被修饰的注解的作用范围,如果不写默认是任何地方都可以使用。
可选的参数值在枚举类ElemenetType中包括:
  1. TYPE: 用在类,接口上
  2. FIELD:用在成员变量上
  3. METHOD: 用在方法上
  4. PARAMETER:用在参数上
  5. CONSTRUCTOR:用在构造方法上
  6. LOCAL_VARIABLE:用在局部变量上
复制代码
@Retention

指定了被修饰的注解的生命周期。
可选的参数值在枚举类型RetentionPolicy中包括:
  1. SOURCE:注解只存在于Java源代码中,编译生成的字节码文件中就不存在了。
  2. CLASS:注解存在于Java源代码、编译以后的字节码文件中,运行的时候内存中没有,默认值。
  3. RUNTIME:注解存在于Java源代码中、编译以后的字节码文件中、运行时内存中,程序可以通过反射获取该注解。
复制代码
正常开发中我们自定义注解的时候无脑用 Runtime 就可以了。
@Documented

指定了被修饰的注解是可以Javadoc等工具文档化。
@Inherited

指定了被修饰的注解修饰程序元素的时候是可以被子类继承的。
四、自定义注解

定义格式
  1. 元注解
  2. public @interface 注解名称{
  3.         属性列表;
  4. }
复制代码
注解的属性

示例如下:
  1. public @interface Student {
  2.   String name();
  3.   int age() default 18;
  4.   String gender() default "男";
  5. }
复制代码
注意:
没有默认值的属性是必填的,当属性只有一个,且属性名为 value 时,可以省略。
示例:
  1. public class Test {
  2.     @Student("zhangsan")
  3.     public void test(){
  4.     }
  5. }
  6. public @interface Student {
  7.   String value();
  8. }
复制代码
反射解析注解

反射请移步:Java反射,看完就会用
如果反射懂了,注解懂了,那就不需要过多解释直接看示例就行了。
自定义注解 Book
  1. @Target({ElementType.METHOD,ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. public @interface Book {
  4.     // 书名
  5.     String value();
  6.     // 价格
  7.     double price() default 100;
  8.     // 作者
  9.     String[] authors();
  10. }
复制代码
BookStore类
  1. @Book(value = "红楼梦",authors = "曹雪芹",price = 998)
  2. public class BookStore {
  3. }
复制代码
TestAnnotation类
  1. public class TestAnnotation {
  2.     public static void main(String[] args)  throws Exception{
  3.         System.out.println("---------获取类上注解的数据----------");
  4.         test();
  5.     }
  6.     /**
  7.      * 获取BookStore类上使用的Book注解数据
  8.      */
  9.     public static void test(){
  10.         // 获得BookStore类对应的Class对象
  11.         Class c = BookStore.class;
  12.         // 判断BookStore类是否使用了Book注解
  13.         if(c.isAnnotationPresent(Book.class)) {
  14.             // 根据注解Class对象获取注解对象
  15.             Book book = (Book) c.getAnnotation(Book.class);
  16.             // 输出book注解属性值
  17.             System.out.println("书名:" + book.value());
  18.             System.out.println("价格:" + book.price());
  19.             System.out.println("作者:" + Arrays.toString(book.authors()));
  20.         }
  21.     }
  22. }
复制代码
联系我:
https://stanezhang.github.io/

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4