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

注解-自定义注解-元注解

元注解:就是用于描述注解的注解

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

    @Retention:苗猪注解被保留的阶段

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

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

MyAnno3类

@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnno3 {
}

 

Worker类

复制代码
@MyAnno(value = 1, strd = "abc", anno2 = @MyAnno2, per = Person.p1)
@MyAnno3
public class Worker {
    @MyAnno3
    public String name = "aaa";


    @MyAnno3
    public void show(){

    }
}
复制代码

 

注解-解析注解

在程序是用哪个(解析)注解:获取注解中定义的属性值

1.获取注解定义的位置的对象

2.获取指定的注解

3.调用注解中的抽象方法获取配置的属性值

 

 

Pro注解

复制代码
/*
    描述需要执行的类名,和方法名
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro {
    String ClassName();
    String methodName();

}
复制代码

Demo1类和Demo2类

public class Demo1 {
    public void show(){
        System.out.println("demo...show...");
    }
}
public class Demo2 {
    public void show(){
        System.out.println("demo2...show2...");
    }
}
ReflectTest类
复制代码
@Pro(ClassName ="cn.itcast.annotation.Demo1",methodName = "show")
public class ReflectTest {
    /*
        前提:不能改变该类的任何代码,可以创建任意类的对象,可以执行任意方法
     */
    public static void main(String[] args) throws Exception {
        //1.解析注解
        //1.1获取该类的字节码文件对象
        Class<ReflectTest> reflectTestClass = ReflectTest.class;
        //2.获取上边的注解对象
        //其实就是在内存中生成了一个该注解接口的子类实现对象
        /*
            public class ProImpl implements Pro(){
                public String className(){
                    return "cn.itcast.annotation.Demo1";
                }
                public String methodName(){
                    return "show";
                }
            }
         */
        Pro annotation = reflectTestClass.getAnnotation(Pro.class);
        //3.调用注解对象中定义的抽象方法,获取返回值
        String className = annotation.ClassName();
        String methodName = annotation.methodName();
        System.out.println(className);
        System.out.println(methodName);


        //3.加载该类进内存
        Class cla = Class.forName(className);
        //4.创建对象
        Object o = cla.newInstance();
        //5.获取方法对象
        Method method = cla.getMethod(methodName);
        //6.执行方法
        method.invoke(o);
    }
复制代码

 

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