gpt4 book ai didi

java - 自定义 Java 注释以跳过方法执行

转载 作者:行者123 更新时间:2023-11-29 06:29:09 25 4
gpt4 key购买 nike

我想创建一个自定义注解来跳过方法执行

这是我的注释代码,带有 validator 类

@Target({ METHOD , FIELD , PARAMETER } )
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy={MyValidator .class})
public @interface MyAnnotation {

String message() default "DEFAULT_FALSE";

Class<?>[] groups() default{};

Class<? extends Payload>[] payload() default{};

}

我用 validator 试过了。这就是我的 validator 的样子

public class MyValidator implements ConstraintValidator<MyAnnotation, String >{

@Override
public void initialize(MyAnnotation arg0) {

}

@Override
public boolean isValid(String arg0, ConstraintValidatorContext arg1) {

if(str=="msg"){
return true;
}
return false;
}

}

这就是我想要使用的方式——我想在方法级别使用注释并跳过方法执行。

我不知道这是否可能..请帮助。

public class Test {



public static void main(String[] args) {
Test t = new Test();
boolean valid=false;

valid=t.validate();
System.out.println(valid);

}

@MyAnnotation(message="msg")
public boolean validate(){

// some code to return true or false
return true;


}
}

最佳答案

你应该为此使用 AOP。创建一个 AspectJ 项目,然后尝试这样的事情:

MyAnnotation.java:

package moo.aspecttest;

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

@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.METHOD })
public @interface MyAnnotation
{
public String value();
}

MyAspectClass.java:

package moo.aspecttest;

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 MyAspectClass
{

@Around("execution(* *(..))")
public Object aroundAdvice(ProceedingJoinPoint point) throws Throwable
{
Method method = MethodSignature.class.cast(point.getSignature()).getMethod();
String name = method.getName();
MyAnnotation puff = method.getAnnotation(MyAnnotation.class);
if (puff != null) {
System.out.println("Method " + name + " annotated with " + puff.value() + ": skipped");
return null;
} else {
System.out.println("Method " + name + " non annotated: executing...");
Object toret = point.proceed();
System.out.println("Method " + name + " non annotated: executed");
return toret;
}
}
}

MyTestClass.java:

package moo.aspecttest;

public class MyTestClass
{

@MyAnnotation("doh")
public boolean validate(String s) {
System.out.println("Validating "+s);
return true;
}

public boolean validate2(String s) {
System.out.println("Validating2 "+s);
return true;
}

public static void main(String[] args)
{
MyTestClass mc = new MyTestClass();

mc.validate("hello");
mc.validate2("cheers");

}
}
}

运行时生成的输出:

Method main non annotated: executing...
Method validate annotated with doh: skipped
Method validate2 non annotated: executing...
Validating2 cheers
Method validate2 non annotated: executed
Method main non annotated: executed

我使用了一个非常通用的 aroundAdvice, 但如果需要,您可以使用 beforeAdvice 。事实上,我认为这一点很明确。

关于java - 自定义 Java 注释以跳过方法执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42509158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com