如何在Kotlin切面中获取RequireEnabledFeature注解的属性值?
解决方案:在Kotlin AOP切面中获取注解属性值
方法一:直接注入注解实例(推荐)
这是Spring AOP的标准用法,通过切点表达式绑定注解对象,无需手动反射:
@Aspect @Component class RequireEnabledFeatureAspect { // 切点表达式中通过 @annotation(变量名) 绑定注解实例 @Around( value = "execution(public * *(..)) && @annotation(requireEnabledFeature)" ) fun requireEnabledFeature( joinPoint: ProceedingJoinPoint, requireEnabledFeature: RequireEnabledFeature // 自动注入匹配到的注解 ): Any? { // 直接读取注解属性 val featureName = requireEnabledFeature.featureName // 这里添加你的功能校验逻辑,比如判断功能是否启用 // if (!checkFeatureEnabled(featureName)) { // throw RuntimeException("功能 $featureName 未开启") // } return joinPoint.proceed() } }
注意:之前注入无效的原因是切点表达式中仅写了@annotation(RequireEnabledFeature),没有绑定到方法参数的变量名。必须用@annotation(变量名)的形式,同时方法参数声明对应注解类型,Spring AOP才会自动注入注解实例。
方法二:通过JoinPoint反射获取注解(备选)
如果因为某些场景无法直接注入注解,可以通过方法签名反射获取当前执行方法的注解:
@Aspect @Component class RequireEnabledFeatureAspect { @Around( value = "execution(public * *(..)) && @annotation(RequireEnabledFeature)" ) fun requireEnabledFeature(joinPoint: ProceedingJoinPoint): Any? { // 获取当前执行方法的签名 val methodSignature = joinPoint.signature as MethodSignature val targetMethod = methodSignature.method // 获取方法上的注解实例 val annotation = targetMethod.getAnnotation(RequireEnabledFeature::class.java) val featureName = annotation?.featureName ?: "" // 功能校验逻辑... return joinPoint.proceed() } }
这种方式避免了手动遍历methods数组的风险(比如方法重载时索引错误),直接获取当前执行的目标方法,再提取注解属性。
内容的提问来源于stack exchange,提问作者Mejmo
相关产品推荐
相关产品推荐

