Java的注解

Java的注解

注解一共分为3大类

  • JDK自带注解
  • 元注解
  • 自定义注解

JDK注解:

  • @Override :用来标识重写方法
  • @SuppressWarnings(“deprecation”) 忽略警告
  • @Deprecated标记就表明这个方法已经过时了,但我就要用,别提示我过期
  • @SafeVarargs jdk1.7出现,堆污染,不常用
  • @FunctionallInterface jdk1.8出现,配合函数式编程拉姆达表达式,不常用

元注解:

  • @Target 注解用在哪里:类上、方法上、属性上等等
    • ElementType.TYPE 应用于类的元素
    • ElementType.METHOD 应用于方法级
    • ElementType.FIELD 应用于字段或属性(成员变量)
    • ElementType.ANNOTATION_TYPE 应用于注释类型
    • ElementType.CONSTRUCTOR 应用于构造函数
    • ElementType.LOCAL_VARIABLE 应用于局部变量
    • ElementType.PACKAGE 应用于包声明
    • ElementType.PARAMETER 应用于方法的参数
  • @Retention 注解的生命周期:源文件中、字节码文件中、运行中
    • SOURCE 在源文件中有效(即源文件保留)
    • CLASS 在class文件中有效(即class保留)
    • RUNTIME 在运行时有效(即运行时保留)
  • @Inherited 允许子注解继承
  • @Documented 生成javadoc时会包含注解,不常用
  • @Repeatable注解为可重复类型注解,可以在同一个地方多次使用,不常用

自定义反射:

package com.cnblogs.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/*
本类用于实现自定义注解
 */
public class TestAnnotation {

}
/*
注意:自定义注解的语法与Java不同,不要套用Java的格式
 */

/*
注解定义时,需要使用 @interface 注解名 的格式
通过@Target注解表示自定义注解@Test可以使用的位置
    使用@Target需要导包
    通过“ElementType.”的方式来自定义注解@Test的可用位置
    如果有多个值,可以使用“{,}”的格式来写
通过@Retention元注解表示自定义注解@Test的生命周期
    使用@Retention需要导包
    通过“RetentionPolicy.”的方式来指定自定义注解@Test的生命周期
    表示这个注解可以存在到什么时期
        源文件中:SOURCE
        字节码文件中:CLASS
        运行时:RUNTIME
    注意:以上只能三选一
 */
@Target({ElementType.METHOD,ElementType.TYPE})
/*自定义注解能加在什么位置,取决于@Target注解的值 */
@Retention(RetentionPolicy.SOURCE)
@interface Test{
    /*
    自定义注解可以添加功能,给注解添加属性
     */
//    int age();//这不是方法的定义,而是给自定义注解中定义age属性
    //为了使用注解方便,可以给属性指定默认值,就可以不用像@Test(age = 1)这样赋值,直接@Test这样写了
    int age() default 0;
    /*
    我们可以添加特殊属性value,这个名字是固定的
        定义格式和普通属性一样,主要区别在于使用时不同
        使用此注解给他赋值的时候,不需要写成”@Test(value = "apple")“,写成”@Test("apple")“
        给value赋予默认值的时候和普通属性一样
     */
//    String value();
    String value() default "banana";
}

/*
使用注解时,只要在指定的自定义注解前面加上“@”符号即可使用此注解
 */
//@Test
/*
    当我们添加了直接的age属性时,注解报错
        当没有定义属性时可以直接使用,添加了属性,添加了属性就必须给属性赋值
 */
class TestAnno{
//    @Test//报错,这里需要在@Target加上值ElementType.FIELD。
    String name;
//    @Test(age = 1)  //注解的赋值 就不报错了
    /*
    给属性赋值的格式为“age = 1”,不能直接写1
     */
    @Test("apple")  //特殊属性value
    public void eat(){
        System.out.println("疯狂干饭!!!");
    }
}

posted @ 2021-07-22 17:04  贪玩的阿柒  阅读(78)  评论(0编辑  收藏  举报