java中自定义注解

想要自己自定义注解,首先我们要知道两个关键的原生注解

@Retention(RetentionPolicy.RUNTIME)
@Target(value = ElementType.METHOD)

这两个原生注解都有一个属性,属性值分别代表的意思
Retention:
1.RetentionPolicy.SOURCE注解只保留在源文件(.java文件)
2.RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,默认值(.class文件)
3.RetentionPolicy.RUNTIME:注解被保存到class文件中,jvm加载class文件之后仍然存在(内存中的字节码)
value
1.ElementType.TYPE:接口、类、枚举、注解
2.ElementType.FIELD:字段、枚举的常量
3.ElementType.METHOD:方法
4.ElementType.PARAMETER:方法参数
5.ElementType.CONSTRUCTOR:构造函数
6.ElementType.LOCAL_VARIABLE:局部变量
7.ElementType.ANNOTATION_TYPE:注解
8.ElementType.PACKAGE:包
了解过两个属性的属性值后大家已经迫不及待的想知道如何进行代码实现了吧,下面请看案例

package com.mr.create_able.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(value = ElementType.METHOD)
public @interface MyAnnotation{
    String value() ;
    String[] paramData();
}

这里呢就是我们自定义的注解@interface,我的target是说我的注解是使用在方法上的

package com.mr.create_able.demo;

import com.mr.create_able.annotation.Execute;

public class DemoAnnotation {
    @MyAnnotation(value = "自定义注解测试",paramData = {"1","2","3","4","5"})
    public void haveAnnotation() {
        System.out.println("注解的");
    }
}

但是我的注解是加上了但是我要怎样去读取它的问题是不是又来了,不然我加这个自定义注解毫无用处啊
下面就是我是在controller层直接对其进行读取啦

    @RequestMapping("/annotation")
    public String testAnnotation() throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException {
        Class<?> aClass = Class.forName("com.mr.create_able.demo.DemoAnnotation");
        //通过Class对象创建当前类对象
        DemoAnnotation o = (DemoAnnotation) aClass.newInstance();
        //获取这个类里面所有的方法对象
        Method[] declaredMethods = aClass.getDeclaredMethods();
        //遍历方法对象数组
        for (Method declaredMethod : declaredMethods) {
            //判断当前方法对象中是否包含(Execute)注解
            if (declaredMethod.isAnnotationPresent(MyAnnotation.class)) {
                //执行当前有注解方法
                declaredMethod.invoke(o);
                //获取当前方法上注解的 (value)属性的值并打印
                String value = declaredMethod.getAnnotation(MyAnnotation.class).value();
                System.out.println(value);
                //获取当前方法上注解的 (paramData)属性的值并遍历打印
                String[] strings = declaredMethod.getAnnotation(MyAnnotation.class).paramData();
                for (String string : strings) {
                    System.out.print(string + ",");
                }
            }
        }
        return "带有注解的执行完毕";
    }

上边的代码呢就是我要读取的注解,大家想要看到结果的话自行cv跑项目,我这里用的springboot框架,当然你们也可以在main方法中去跑,都可以的,好了大家我们下次再见吧.拜拜


版权声明:本文为weixin_45325562原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。