在《Java注解之基本语法》中我们详细说明了Java中注解的基本语法,也通过一个简单的例子演示了一个简单的注解是怎么定义和使用的。我们知道,在实际的业务开发中,简单的会这点东西是远远不够的。在实际开发中我们定义的注解一般会有实际的逻辑意义,可以在运行时改变程序的执行逻辑,下面就接上上一篇文章讲解在Java中解析注解。这里主要分为两个部分进行讲解:类注解解析、方法注解解析。

1. 类注解解析

类注解解析主要分为以下三步:

第一步:使用类加载器加载类;

第二步:找到类上面的注解;

第三步:获取注解实例。

为了方便在本节浏览,这里将之前章节的代码贴出来,以下是注解的定义和使用:

注解定义代码:

package com.study.annotation.user_defined;

import java.lang.annotation.*;

/**
 * <p>Title: Util</p >
 * <p>Description: 自定义注解</p >
 * <p>Company: http://www.yinjiedu.com</p >
 * <p>Project: concurrency</p >
 *
 * @author: qiwei
 * @Date: 2019/10/10 23:30
 * @Version: 1.0
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Util {
    String desc();

    String auth() default "WEIQI";

    String dateTime();
}

注解使用代码:

package com.study.annotation.user_defined;

import org.springframework.stereotype.Component;

/**
 * <p>Title: CommonParameter</p >
 * <p>Description: common parameter</p >
 * <p>Company: http://www.yinjiedu.com</p >
 * <p>Project: concurrency</p >
 *
 * @author: qiwei
 * @Date: 2019/10/10 23:36
 * @Version: 1.0
 */
@Component
@Util(desc = "公共参数定义", dateTime = "2019-10-10")
public class CommonParameter {
    public final static String SUCCESS_CODE = "200";
}

注解解析代码

按照上面的步骤,这里对CommonParameter类上面的注解进行解析,代码如下:

package com.study.annotation.parse_annotation;

import com.study.annotation.user_defined.Util;

/**
 * <p>Title: ParseAnnotation</p >
 * <p>Description: parse annotation</p >
 * <p>Company: http://www.yinjiedu.com</p >
 * <p>Project: concurrency</p >
 *
 * @author: qiwei
 * @Date: 2019/10/12 23:46
 * @Version: 1.0
 */
public class ParseAnnotation {

    public static void main(String[] args) {
        try {
            // 使用类加载器加载类
            Class clazz = Class.forName("com.study.annotation.user_defined.CommonParameter");
            // 找到类上面的注解
            boolean isExistAnno = clazz.isAnnotationPresent(Util.class);
            if (isExistAnno) {
                // 获取注解实例
                Util util = (Util)clazz.getAnnotation(Util.class);
                // 打印使用注解输入的信息
                System.out.println("annotation desc is : " + util.desc());
                System.out.println("annotation auth is : " + util.auth());
                System.out.println("annotation dateTime is : " + util.dateTime());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

输出结果如下:

Java中corn解析器 java 解析_注解解析

 2. 方法注解解析

解析方法上面的注解和解析类注解差不多类似,只是获取注解的时候需要使用不同的方法,并且使用不同的接受对象去接受,实现代码如下:

注解定义代码:

package com.study.annotation.user_defined;

import java.lang.annotation.*;

/**
 * <p>Title: VerifyMobile</p >
 * <p>Description: 验证手机号</p >
 * <p>Company: http://www.yinjiedu.com</p >
 * <p>Project: concurrency</p >
 *
 * @author: qiwei
 * @Date: 2019/10/13 00:12
 * @Version: 1.0
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface VerifyMobile {
    boolean isRequire() default true;
    String mobile();
}

注解使用代码:

package com.study.annotation.user_defined;

/**
 * <p>Title: LoginController</p >
 * <p>Description: user login</p >
 * <p>Company: http://www.yinjiedu.com</p >
 * <p>Project: concurrency</p >
 *
 * @author: qiwei
 * @Date: 2019/10/13 00:15
 * @Version: 1.0
 */
public class LoginController {

    @VerifyMobile(mobile = "137187176XX")
    public String login() {
        return "enter phone number is true";
    }
}

解析注解代码:

package com.study.annotation.parse_annotation;

import com.study.annotation.user_defined.VerifyMobile;

import java.lang.reflect.Method;
/**
 * <p>Title: ParseMethodAnnotation</p >
 * <p>Description: parse method annotation</p >
 * <p>Company: http://www.yinjiedu.com</p >
 * <p>Project: concurrency</p >
 *
 * @author: qiwei
 * @Date: 2019/10/13 00:17
 * @Version: 1.0
 */
public class ParseMethodAnnotation {

    public static void main(String[] args) {

        try {
            // 使用类加载器加载类
            Class clazz = Class.forName("com.study.annotation.user_defined.LoginController");
            // 找到方法上面的注解
            Method[] methods = clazz.getMethods();
            for (Method method : methods) {
                // 验证方法上是否存在VerifyMobile注解
                boolean isMethodExist = method.isAnnotationPresent(VerifyMobile.class);
                if (isMethodExist) {
                    // 获取注解实例
                    VerifyMobile verifyMobile = (VerifyMobile)method.getAnnotation(VerifyMobile.class);
                    // 打印使用注解输入的信息
                    System.out.println("verifyMobile annotation isRequire is : " + verifyMobile.isRequire());
                    System.out.println("verifyMobile annotation mobile is : " + verifyMobile.mobile());
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

输出结果:

Java中corn解析器 java 解析_注解解析_02

总结:上面是注解的基本解析规则及代码,在实际的工作中灵活使用,可以写出非常简洁的代码,下篇文章我会写一篇注解实战帮助大家理解。