首页 > 其他分享 >注解-自定义注解-元注解和解析注解

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

时间:2022-09-25 09:34:30浏览次数:65  
标签:methodName String 自定义 show class 注解 解析 public

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

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

    @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);
    }

 

 

标签:methodName,String,自定义,show,class,注解,解析,public
From: https://www.cnblogs.com/yuzong/p/16726338.html

相关文章