java注解
2023-12-13 05:17:16
java代码里的特殊标记,比如@Override,@Test等
注解可以用在类上,构造器上,方法上,成员变量上,参数上等位置处
作用:让其他程序根据注解信息来决定怎么执行该程序
1. 自定义注解
public @interface ZyTest {
String description() default "woc,op------------------------";
int[] aaa();
}
特殊属性名:
- 如果注解中只有一个value属性,使用注解时,value名称可以不写
2. 注解的原理
注解的本质是一个接口,java中所有的注解都是继承了Annotation接口的
- @注解(…):其实就是一个实现类对象,实现了该注解以及Annotation接口
3. 元注解
指的是修饰注解的注解,常见的有@Target,@Retention
3.1. @Target
声明被修饰的注解只能在哪些位置使用
- TYPE,类,接口
- FIELD,成员变量
- METHOD,成员方法
- PARAMETER,方法参数
- CONSTRUCTOR,构造器
- LOCAL_VARIABLE,局部变量
如。
现设计让这个注解只能作用在类上和成员方法上
@Target({ElementType.TYPE,ElementType.METHOD})// 被修饰的注解只能用在类上和成员方法上
public @interface ZyTest2 {
}
可以看到把它作用在成员变量时就报错了
3.2. @Retention
声明注解的保留周期
- SOURCE
- 只作用在源码阶段,字节码中不存在
- CLASS(默认值)
- 保留到字节码阶段,运行阶段不存在
- RUNTIME(开发常用)
- 一直保留到运行阶段
如。
@Retention(RetentionPolicy.RUNTIME)// 指定注解的有效范围为一直到运行时
public @interface ZyTest2 {
}
4. 注解的解析
就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来
如何解析注解:
- 指导思想:要解析谁上面的注解,就应该先拿到谁
- 比如要解析类上面的注解,则应该先获取类的Class对象,再通过Class对象解析其上面的注解
- 比如要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解
- Class、Method、Field、Constructor,都实现了AnnotatedElement接口,它们都拥有解析注解的能力。
案例:
注解,
@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属性
}
}
文章来源:https://blog.csdn.net/PiggyOne123/article/details/134811105
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!