java注解


java代码里的特殊标记,比如@Override,@Test等
注解可以用在类上,构造器上,方法上,成员变量上,参数上等位置处
作用:让其他程序根据注解信息来决定怎么执行该程序

1. 自定义注解

image.png

public @interface ZyTest {
    String description() default "woc,op------------------------";
    int[] aaa();
}

image.png
特殊属性名:

  • 如果注解中只有一个value属性,使用注解时,value名称可以不写

2. 注解的原理

image.png注解的本质是一个接口,java中所有的注解都是继承了Annotation接口的

  • @注解(…):其实就是一个实现类对象,实现了该注解以及Annotation接口

3. 元注解

指的是修饰注解的注解,常见的有@Target,@Retention

3.1. @Target

声明被修饰的注解只能在哪些位置使用

  1. TYPE,类,接口
  2. FIELD,成员变量
  3. METHOD,成员方法
  4. PARAMETER,方法参数
  5. CONSTRUCTOR,构造器
  6. LOCAL_VARIABLE,局部变量

如。
现设计让这个注解只能作用在类上和成员方法上

@Target({ElementType.TYPE,ElementType.METHOD})// 被修饰的注解只能用在类上和成员方法上
public @interface ZyTest2 {
}

可以看到把它作用在成员变量时就报错了
image.png

3.2. @Retention

声明注解的保留周期

  1. SOURCE
  • 只作用在源码阶段,字节码中不存在
  1. CLASS(默认值)
  • 保留到字节码阶段,运行阶段不存在
  1. RUNTIME(开发常用)
  • 一直保留到运行阶段

如。
image.png

@Retention(RetentionPolicy.RUNTIME)// 指定注解的有效范围为一直到运行时
public @interface ZyTest2 {
}

4. 注解的解析

就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来

如何解析注解:

  • 指导思想:要解析谁上面的注解,就应该先拿到谁
  • 比如要解析类上面的注解,则应该先获取类的Class对象,再通过Class对象解析其上面的注解
  • 比如要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解
  • Class、Method、Field、Constructor,都实现了AnnotatedElement接口,它们都拥有解析注解的能力。

image.png

案例:
image.png
注解,

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ZyTest3 {
    String value();
    double aaa() default 100;
    String[] bbb();
}

Demo类,

@ZyTest3(value = "zy",aaa = 512.2,bbb = {"I","love","lh"})
public class Demo {
    @ZyTest3(value = "lh",aaa = 99.9,bbb = {"What","did","I","do?"})
    public void test1(){}
}

AnnotationTest类,

public class AnnotationTest {
    public static void main(String[] args) throws NoSuchMethodException {
        Demo demo = new Demo();//创建Demo对象
        Class<? extends Demo> demoClass = demo.getClass();//获取democlass对象
        System.out.println(demoClass.isAnnotationPresent(ZyTest3.class));//调用方法判断demo类上有没有ZyTest3注解
        Method test1 = demoClass.getDeclaredMethod("test1");//获取test1方法对象
        ZyTest3 zyTest3 = test1.getDeclaredAnnotation(ZyTest3.class);//获取test1方法上的注解对象
        System.out.println(Arrays.toString(zyTest3.bbb()));//获取注解上的bbb属性
    }
}

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值