注解_自定义注解_元注解-注解_解析注解

注解_自定义注解_元注解

用于描述注解的注解

  @Target : 描述注解能够作用的位置

  @Retention : 描述注解被保留的阶段

  @Documented : 描述注解是否被抽取到api文档中

  @Inherited : 描述注解是否被子类继承

复制代码
package Z_01.annotation;

import java.lang.annotation.*;

/**
 *   @Target : 描述注解能够作用的位置
 *
 *   @Retention : 描述注解被保留的阶段
 *
 *   @Documented : 描述注解是否被抽取到api文档中
 *
 *   @Inherited : 描述注解是否被子类继承
 */
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})//表示该My Anno3注解只能作用于类上
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnno3 {

}
复制代码

 

 

注解_解析注解

注解处理器

何为解析注解?即通过反射获取类、函数或成员上的 运行时注解信息,从而实现动态控制程序运行的逻辑。
解析注解主要用到两个类库:
1.1. java.lang.annotation.Annotation
Java使用Annotation接口来代表程序元素前面的注解,该接口是所有Annotation类型的父接口。
1.2. java.lang.reflect.AnnotatedElement
AnnotatedElement 接口代表程序中可以接受注解的程序元素,是所有程序元素(Class、Method 、Field、Package和Constructor)的父接口。获取该接口对象之后,即可以调用对象方法来访问Annotation信息,常用有如下几个:
  1. getAnnotations():返回该程序元素上存在的所有注解。
  2. isAnnotationPresent(annotation.class):判断该程序元素上是否包含指定类型的注解
  3. getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。

复制代码
package Z_01.annotation;

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

/**
 * 描述需要执行的类名,和方法名
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro {

    String className();
    String methodName();


    /*
    public class ProImpl implements Pro{
        return Z_01.annotation.Demo1;
    }
    String methodName(){
        return "show";
    }
     */
}
******************************************

public enum Person {

P1,P2;
}

******************************************
public class Demo1 {
public void show(){
System.out.println("demo1...show...");
}
}
******************************************
package Z_01.annotation;


@Pro(className = "Z_01.annotation.Demo1",methodName = "show")
public class ReflectTest {
public static void main(String[] args) {

/*
前提:不能改变该类的任何代码.可以创建任意类的对象,可以执行任意方法
*/

//1.解析注解
//1.1获取该类的字节码文件对象
Class<ReflectTest> reflectTestClass = ReflectTest.class;
//获取上边的注解对象
Pro an = reflectTestClass.getAnnotation(Pro.class);//其实就是在内存中生成了一个该注解接口的子类实现对象
//3.调用注解对象中定义的抽象方法,获取返回值
String className = an.className();
String methodName = an.methodName();
System.out.println(className);
System.out.println(methodName);
}
}
 
复制代码

 

posted @   ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ  阅读(79)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示