Java注解,看完就会用

一、什么是注解

定义:注解(Annotation),也叫元数据。一种代码级别的说明。

它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。

它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

二、内置注解

  • @Override: 标记在成员方法上,用于标识当前方法是重写父类(父接口)方法,编译器在对该方法进行编译时会检查是否符合重写规则,如果不符合,编译报错。
  • @Deprecated: 用于标记当前类、成员变量、成员方法或者构造方法过时如果开发者调用了被标记为过时的方法,编译器在编译期进行警告。
  • @SuppressWarnings: 压制警告注解,可放置在类和方法上,该注解的作用是阻止编译器发出某些警告信息。

三、元注解

元注解即注解的注解。

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

@Target

指定被修饰的注解的作用范围,如果不写默认是任何地方都可以使用。

可选的参数值在枚举类ElemenetType中包括:

java 复制代码
TYPE: 用在类,接口上
FIELD:用在成员变量上
METHOD: 用在方法上
PARAMETER:用在参数上
CONSTRUCTOR:用在构造方法上
LOCAL_VARIABLE:用在局部变量上

@Retention

指定了被修饰的注解的生命周期。

可选的参数值在枚举类型RetentionPolicy中包括:

java 复制代码
SOURCE:注解只存在于Java源代码中,编译生成的字节码文件中就不存在了。
CLASS:注解存在于Java源代码、编译以后的字节码文件中,运行的时候内存中没有,默认值。
RUNTIME:注解存在于Java源代码中、编译以后的字节码文件中、运行时内存中,程序可以通过反射获取该注解。

正常开发中我们自定义注解的时候无脑用 Runtime 就可以了。

@Documented

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

@Inherited

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

四、自定义注解

定义格式

java 复制代码
元注解
public @interface 注解名称{
	属性列表;
}

注解的属性

  • 格式1:数据类型 属性名();
  • 格式2:数据类型 属性名() default 默认值;

示例如下:

java 复制代码
public @interface Student {
  String name(); 
  int age() default 18; 
  String gender() default "男"; 
} 

注意:

没有默认值的属性是必填的,当属性只有一个,且属性名为 value 时,可以省略。

示例:

java 复制代码
public class Test {
    @Student("zhangsan")
    public void test(){

    }
}
public @interface Student {
  String value(); 
} 

反射解析注解

反射请移步:Java反射,看完就会用

如果反射懂了,注解懂了,那就不需要过多解释直接看示例就行了。

自定义注解 Book

java 复制代码
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Book {
    // 书名
    String value();
    // 价格
    double price() default 100;
    // 作者
    String[] authors();
}

BookStore类

java 复制代码
@Book(value = "红楼梦",authors = "曹雪芹",price = 998)
public class BookStore {
}

TestAnnotation类

java 复制代码
public class TestAnnotation {
    public static void main(String[] args)  throws Exception{
        System.out.println("---------获取类上注解的数据----------");
        test();
    }

    /**
     * 获取BookStore类上使用的Book注解数据
     */
    public static void test(){
        // 获得BookStore类对应的Class对象
        Class c = BookStore.class;
        // 判断BookStore类是否使用了Book注解
        if(c.isAnnotationPresent(Book.class)) {
            // 根据注解Class对象获取注解对象
            Book book = (Book) c.getAnnotation(Book.class);
            // 输出book注解属性值
            System.out.println("书名:" + book.value());
            System.out.println("价格:" + book.price());
            System.out.println("作者:" + Arrays.toString(book.authors()));
        }
    }
}

联系我:
https://stanezhang.github.io/

相关推荐
楠寻寻2 天前
SpringBoot中的注解详解(一)
java·spring boot·后端·spring·注解
cyt涛16 天前
Spring Cache-基于注解的缓存
java·redis·spring·缓存·框架·cache·注解
G皮T23 天前
【Java】Java 的反射机制(三):反射的实际运用
java·注解·反射·reflection
无理 Java1 个月前
【实战教程】SpringBoot全面指南:快速上手到项目实战(SpringBoot)
java·后端·面试·springboot·事务·注解·日志
码农研究僧1 个月前
详细分析Spring Framework中 @ConditionalOnProperty的基本知识(附Demo)
java·后端·spring·注解
ian唐1 个月前
【每天学个新注解】Day 13 Lombok注解简解(十二)—@Delegate
java·注解·lombok
cyt涛2 个月前
Redis访问工具
数据库·redis·spring cache·注解·客户端·lettuce·redistemplae
东皋长歌2 个月前
@EqualsAndHashCode注解使用
java·开发语言·注解·lombok
无理 Java3 个月前
【Spring Boot进阶】掌握Spring Boot框架核心注解:从入门到精通(实战指南)
java·spring boot·后端·spring·面试·框架·注解
heartfluttering3 个月前
【注解】反序列化时匹配多个 JSON 属性名 @JsonAlias 详解
java·注解·映射·反序列