Java注解(Annotation)

一:了解

1.就是Java代码里的特殊标记,比如:@Override、@Test等,作用是:让其他程序根据注解信息来决定怎么执行该程序。

2.注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处。

二:自定义注解

就是自己定义注解。

public @interface MyTest1 {
    String aaa();
    boolean bbb() default true;
    String[] ccc();

}

特殊属性名:value

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

public @interface MyTest1 {
    String value();
}

@MyTest1("王凯")

三:注解的原理

1.注解本质是一个接口,Java中所有注解都是继承了Annotation接口的。

2.@注解(...):其实就是一个实现类的对象,实现了该注解以及Annotation接口。1

四:元注解

1.指的是:修饰注解的注解

2.@Target

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

@Target(ElementType.TYPE)

①TYPE 类,接口

②FIELD 成员变量

③METHOD 成员方法

④PARAMETER 方法参数

⑤CONSTRUCTOR 构造器

⑥LOCAL_VARIABLE 局部变量

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

@Target({ElementType.TYPE,ElementType.ANNOTATION_TYPE})
public @interface MyTest1 {
    String value();
}

3.@Retention

作用:声明注解的保留周期

@Retention(RetentionPolicy.RUNTIME)

①SOURCE 只作用在源码阶段,字节码文件中不存在

②CLASS(默认值) 保留到字节码文件阶段,运行阶段不存在

③RUNTIME(开发常用) 一直保留到运行阶段

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

@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest1 {
    String value();
}

五:注解的解析

1.什么是注解的解析?

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

2.如何解析注解?

①指导思想:要解析谁上面的注解,就应该先拿到谁。

②比如要解析类上面的注解,则应该先获取类的Class对象,再通过Class对象解析其上面的注解。

③比如要解析成员方法上的注解,则应该获取到该成员方法的Methond对象,再通过Methond对象解析其上面的注解。

④Class、Methond、Fileld、Constructor、都实现了AnnotatedElement接口,它们都拥有解析注解的能力。

3.AnnotatedElement接口提供了解析注解的方法

getDeclaredAnnotations() 获取当前对象上面的注解

getDeclaredAnnotation(Class<T> annotationClass) 获取指定的注解对象

isAnnotationPresent(Class<Annotation> annotationClass) 判断当前对象上是否存在某个注解

4.示例:

import java.lang.reflect.Method;
import java.util.Arrays;

public class AnnotationTest2 {
    public static void main(String[] args) throws Exception {
        parseClass();
    }
    public static void parseClass() throws Exception {
        Class c = Demo.class;
        Method m = c.getDeclaredMethod("test1");
        if (m.isAnnotationPresent(MyTest2.class)){
            MyTest2 myTest2 = (MyTest2) m.getDeclaredAnnotation(MyTest2.class);
            System.out.println(myTest2.aaa());
            System.out.println(myTest2.value());
            System.out.println(Arrays.toString(myTest2.bbb()));
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值