自定义注解以及注解解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33355821/article/details/85380074

上面一篇介绍了注解的基本概念,这篇主要是注解的自定义开发以及解析注解

一.自定义注解:

这里创建了一个加在方法上以及类上的注解:

package com.ann.test;

import java.lang.annotation.*;

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
    String desc();
    String author();
    int age() default 18;
}

使用:

package com.ann.test;

public class Child implements Person{
    @Override
    @Description(desc="miaoshu",author = "sqz")
    public String name() {
        return null;
    }

    @Override
    public String age() {
        return null;
    }

    @Override
    public String sing() {
        return "zhangsan";
    }
}

这时候是加在类上与方法上的注解,我们把ElementType.TYPE去掉,那么在类上再加注解就会报错

二:解析注解:

概念:通过反射获取类,函数,变量上的运行时注解信息,从而实现动态控制程序的运行逻辑

注解类定义:

package com.ann.test;

import java.lang.annotation.*;

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
    String value();//此时只有一个成员,只能用value()
}

使用类: 

package com.ann.test;
@Description("i am class annotation")
public class Child implements Person{
    @Override
    @Description("i am method annotation")
    public String name() {
        return null;
    }

    @Override
    public String age() {
        return null;
    }

    @Override
    public String sing() {
        return "zhangsan";
    }
}

解析类:

package com.ann.test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class ParseAnno {
    public static void main(String[] args) {
        //1.使用类加载器加载类
        try {
            Class c = Class.forName("com.ann.test.Child");
            //2.找到类上面的注解
            boolean isexists = c.isAnnotationPresent(Description.class);//这个类上是否存在Description注解
            if (isexists){
                //3.如果存在就拿到注解实例
                Description description = (Description) c.getAnnotation(Description.class);
                System.out.println(description.value());//打印属性
            }
            //4.找到方法上的注解
            Method[] methods = c.getMethods();
            //方式一:
            for (Method m:methods){
                boolean isMeAno = m.isAnnotationPresent(Description.class);
                //如果方法上的注解是Description,就拿到注解实例
                if (isMeAno){
                    Description description = m.getAnnotation(Description.class);
                    System.out.println(description.value());
                }
            }

            //方式二:
            for (Method m:methods){
                //拿到方法上所有注解
                Annotation[] as = m.getAnnotations();
                for (Annotation a :as){
                    if (a instanceof Description){
                        Description d = (Description)a;
                        System.out.println(d.value());
                    }
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

用法: 
         result = object instanceof class 
参数: 
         Result:布尔类型。 
         Object:必选项。任意对象表达式。 
         Class:必选项。任意已定义的对象类。 

结果:

注意:如果把注解生命周期改成 CLASS或者SOURCE则不能打印出任何结果,只能是运行时注解

还有就是注解的继承只能写在类上,不能加在接口上

 

猜你喜欢

转载自blog.csdn.net/qq_33355821/article/details/85380074