我使用AspectJ创建了一个自定义注释,并尝试创建注释,如果注释无效,将有助于跳过方法。
但我的方法体不会被执行
这是我的代码
这是约束
package com.test;
public @interface SwitchLiteConstraint {
Class<SwitchLiteValidator>[] validatedBy();
}
下面是约束验证器
package com.test;
import java.lang.annotation.Annotation;
public interface SwitchLiteConstraintValidator<T1 extends Annotation, T2> {
void initialize(T1 annotation);
boolean isValid(T2 value, SwitchLiteConstraintValidatorContext validatorContext);
}
下面是我的方面类
package com.test;
import java.lang.reflect.Method;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
@Aspect
public class SwitchLiteValidationAspect {
@Around("execution(boolean *(..))")
public boolean skipValidation(ProceedingJoinPoint thisJoinPoint) throws Throwable {
Method method = MethodSignature.class.cast(thisJoinPoint.getSignature()).getMethod();
SwitchLiteAnnotation puff = method.getAnnotation(SwitchLiteAnnotation.class);
if (puff == null) {
System.out.println(" puff null returning true ");
return true;
} else {
String aspectName = puff.message().trim();
if(aspectName.equalsIgnoreCase("msg")){
System.out.println(" returning true ");
return true;
}else{
System.out.println(" returning false ");
return false;
}
}
}
}
下面是验证器实现
package com.test;
public class SwitchLiteValidator implements SwitchLiteConstraintValidator<SwitchLiteAnnotation, String> {
@Override
public void initialize(SwitchLiteAnnotation annotation) {}
@Override
public boolean isValid(String value, SwitchLiteConstraintValidatorContext validatorContext) {
if ("msg".equalsIgnoreCase(value)){
//return true;
return true;
}
//return false;
return false;
}
}
下面是我的自定义注释
package com.test;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.*;
@Target({ METHOD, FIELD, PARAMETER })
@Retention(RUNTIME)
@SwitchLiteConstraint(validatedBy = { SwitchLiteValidator.class })
public @interface SwitchLiteAnnotation {
String message() default "DEFAULT_FALSE";
}
以下是示例,我使用注释的方式
package com.test;
public class Application {
public static void main(String[] args) {
Application application = new Application();
boolean first=false;
boolean second=false;
first=application.validate1();
second=application.validate2();
System.out.println(first);
System.out.println(second);
}
@SwitchLiteAnnotation(message = "abc")
public boolean validate1() {
System.out.println("validate1");
return true;
}
@SwitchLiteAnnotation(message = "msg")
public boolean validate2() {
System.out.println("validate2");
return true;
}
}
问题是我的System.out.println(“validate1”);和System.out.println(“validate2”);正在执行
答案 0 :(得分:0)
您的注释SwitchLiteConstraint
需要运行时保留,否则它在运行时将不可见,因此对方面不可见。你可能只是忘记了。
更新:我复制了所有源代码并在我的计算机上进行了尝试。我不明白你的问题是什么。没有方面输出是:
validate1
validate2
true
true
根据方面,输出变为:
returning false
returning true
false
true
这不是你想要的吗?