注解内容提取(类上、方法上)

本文详述了如何在Java中提取自定义注解的内容,包括方法上和类上的注解。介绍了注解的创建、使用以及内容提取的步骤,类上的注解内容提取需要进行类型转换。

了解自定义注解详细解释

开头总结(具体代码在下面)

方法上的注解内容可以直接获取、类上的需要强转

方法上自定义注解内容提取
/**
 * Log代表method所在类
 */
String doType = method.getAnnotation(Log.class).doType();
类上自定义注解内容提取
/**
 * clazz代表有Module这个自定义注解的类
 */
String value = (Module)clazz.getAnnotation(Module.class).value();
//拆分写法
Annotation annotation = clazz.getAnnotation(Module.class);// 获取类上指定的 注解

Module module = (Module) annotation;// 类上的注解需要强转

String value = module.value();// 获取注解内容

方法上的自定义注解

自定义注解
/**
 * 自定义日志注解
 * @author Kuwei
 * ElementType.METHOD 表明是方法上使用的注解
 */
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {

    /** 要执行的操作类型比如:add操作 **/ 
    String doType() default "";

    /** 要执行的具体操作比如:添加用户 **/
    String doName() default "";
}
注解使用
@Controller
@RequestMapping("bankLogCtrl")
public class BankLogController {

    @RequestMapping("getLogs")
    @Log(doType = "select",doName = "日志列表")
    public @ResponseBody Map<String,Object> getLogs(Integer page) throws Exception {
        ...
        return map;
    }
}
注解内容提取
@After("controllerAspect()")  
    public  void after(JoinPoint joinPoint) throws Throwable {
        try {
            String targetName = joinPoint.getTarget().getClass().getName(); // 目标类全路径名
            String methodName = joinPoint.getSignature().getName(); // 目标方法名(正在访问的方法)
            Object[] arguments = joinPoint.getArgs(); // 方法参数:数组类型
            Class targetClass = Class.forName(targetName); // 反射得到目标类
            Method[] methods = targetClass.getMethods(); // 反射得到目标类的所有方法
            String doType = "";
            String doName = "";
            for (Method method : methods) {
                if (method.getName().equals(methodName)) {
                    Class[] clazzs = method.getParameterTypes();
                    if (clazzs.length == arguments.length) {
                        //方法上的注解内容提取
                        doType = method.getAnnotation(Log.class).doType();
                        doName = method.getAnnotation(Log.class).doName();
                        break;
                    }
                }
            }
       }

类上的自定义注解

自定义注解
/**
 * 自定义模块注解
 * @author Kuwei
 * ElementType.TYPE 表明类上使用的注解
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Module {

    String value() default "";
}
注解使用
@Module("登录模块")
@Controller
@RequestMapping("bankLogCtrl")
public class BankLogController {
    ...
}
注解内容提取
@After("controllerAspect()")  
    public  void after(JoinPoint joinPoint) throws Throwable {

            String targetName = joinPoint.getTarget().getClass().getName(); // 目标类全路径名
            Class clazz= Class.forName(targetName); // 反射得到目标类

            try {
                // 判断是否有注解
                boolean has = clazz.isAnnotation();
                if (has) {
                    // 获取类上指定的 注解
                    Annotation annotation = clazz.getAnnotation(Module.class);
                    // 类上的注解需要强转
                    Module module = (Module) annotation;
                    // 获取强 转之后类上的方法名字
                    exception_model_name = module.value();
                } 
            } catch (ClassNotFoundException e1) {
                e1.printStackTrace();
            }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fool_dawei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值