自定义注解

Posted by     "" on Monday, 2019年06月24日

[TOC]

注解定义

转载地址:https://www.cnblogs.com/longshiyVip/p/4707519.html

注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。在常用的框架中的@controller @service等这样的注解就是通过定义后,然后反射获取对象,然后实例化bean对象的。

Java中提供了四种元注解

转载地址:https://blog.csdn.net/u013700502/article/details/79729882

@Target

表示注解作用在什么地方,CONSTRUCTOR 声明在构造器、FIELD 域声明、METHOD 方法声明、PACKAGE 包声明、TYPE 类、接口或者enum声明、PARAMETER参数声明、LOCAL_VALABLE局部变量声明

@Retention

表示在什么级别保存注解信息,SOURCE注解在编译器编译时丢弃、CLASS注解在编译之后的class文件中存在,但会被VM丢弃、RUNTIME VM将在运行期也保留注解,因此可以用反射读取注解的信息

@Documented

将此注解包含在JavaDoc中

@Inherited

允许子类继承父类中的注解

具体代码实现

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

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
     String requestMethod();
     String requestAction();
}
import java.lang.reflect.Method;

public class AnnotationDemo {

    @MyAnnotation(requestMethod = "get", requestAction = "/getData")
    public void test() {

    }

    public static void main(String[] args) {
        try {
            Class<?> cls = Class.forName("com.example.basedemo.annotationdemo.AnnotationDemo");
            System.out.println("处理的对象-->"+cls);

            Method[] methods = cls.getDeclaredMethods();
            for (Method method : methods) {
                //过滤不含自定义注解AnnotationInfo的方法
                boolean isHasAnnotation = method.isAnnotationPresent(MyAnnotation.class);
                if (isHasAnnotation) {
                    method.setAccessible(true);
                    //获取方法上的注解
                    MyAnnotation aInfo = method.getAnnotation(MyAnnotation.class);
                    if (aInfo == null) return;
                    //解析注解上对应的信息
                    String requestMethod = aInfo.requestMethod();
                    System.out.println("requestMethod: " + requestMethod);

                    String requestAction = aInfo.requestAction();
                    System.out.println("requestAction: " + requestAction);
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

从上面的列子可以猜测, 我们平常在使用一个请求怎么来对应到一个controller中的方法中, 我们在spring运行的时候,会把所有的请求的url和类里面的方法作为一个键值对,我们在浏览器端请求url的时候,就会去找这个url对应的方法,这样就到具体的方法里面了。

「真诚赞赏,手留余香」

真诚赞赏,手留余香

使用微信扫描二维码完成支付