gpt4 book ai didi

java - 如何使用JDK8和JDK11读取java注释的值?

转载 作者:行者123 更新时间:2023-12-01 19:28:26 25 4
gpt4 key购买 nike

如何使用JDK8和JDK11读取java注释的值?

import io.cucumber.java.en.When;

public class Sof {

private static final Logger log = LoggerFactory.getLogger(Sof.class);

@When(value = "I update text {string} with {string}(\\?)")
public static void main(String[] args) {
Class c = Sof.class;
Method[] methods = c.getMethods();
Method method = null;
for (Method m : methods) {
if (m.getName().equals("main")) {
method = m;
}
}
Annotation stepAnnotation = method.getAnnotation(When.class);
Object as[] = { "a", "b" };
Matcher matcher = Pattern.compile("value=(.*)\\)").matcher(stepAnnotation.toString());
if (matcher.find()) {
log.info("---> " + stepAnnotation.annotationType().getSimpleName() + " " + String.format(matcher.group(1).replaceAll("\\{\\S+\\}", "{%s}").replace("(\\?)", ""), as));
} else {
System.err.println("error");
}
}

}

/!\实际上,我不知道注释 @When 的类型。这可以是 io.cucumber.java 包中的任何接口(interface)

JDK8结果:

---> When I update text {a} with {b}

结果 JDK11(额外引号):(stepAnnotation.toString() 不同!)

---> When "I update text {a} with {b}"

编辑 openjdk11oraclejdk11 不尊重 javadoc:

/**
* Returns a string representation of this annotation. The details
* of the representation are implementation-dependent, but the following
* may be regarded as typical:
* <pre>
* &#064;com.acme.util.Name(first=Alfred, middle=E., last=Neuman)
* </pre>
*
* @return a string representation of this annotation
*/
String toString();

最佳答案

您不应依赖 toString() 实现,该实现通常仅用于调试/日志记录。

参见Is it possible to read the value of a annotation in java?有关如何读取注释值的更多详细信息。

更新:

要通过反射完成所有事情,您可以这样做:

import org.springframework.transaction.annotation.Transactional;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;

public class AnnotationTest {
public static void main(String[] args) throws IllegalAccessException, InvocationTargetException {
Method[] methods = AnnotationTest.class.getMethods();
System.out.println("methods = " + Arrays.toString(methods));
for (Method method : methods) {
System.out.println("method = " + method);
Annotation[] annotations = method.getAnnotations();
System.out.println("annotations = " + Arrays.toString(annotations));

for (Annotation annotation : annotations) {
System.out.println("annotation = " + annotation);

Class<? extends Annotation> annotationClass = annotation.annotationType();
System.out.println("annotationClass = " + annotationClass);
Method[] annotationMethods = annotationClass.getMethods();
System.out.println("annotation methods = " + Arrays.toString(annotationMethods));
for (Method annotationMethod : annotationMethods) {
if (Modifier.isPublic(annotationMethod.getModifiers())) {
String name = annotationMethod.getName();
Object o = annotationMethod.invoke(annotation);
System.out.println(name + ": " + o);
}

}
}
}
}

@Transactional("bla")
public void test() {
}
}

(我在这里使用了 Spring 的注释之一,因为那是我的类路径中碰巧有的)

更新(解决方案结束):

@When(value = "I update text {string} with {string}(\\?)")
public static void main(String[] args) {
Object as[] = { "a", "b" };
Class c = Sof.class;
Method[] methods = c.getMethods();
Method method = null;
for (Method m : methods) {
if (m.getName().equals("main")) {
method = m;
}
}
Annotation stepAnnotation = method.getAnnotation(When.class);
Class<? extends Annotation> annotationClass = stepAnnotation.annotationType();
try {
Method valueMethods = annotationClass.getDeclaredMethod("value");
if (Modifier.isPublic(valueMethods.getModifiers())) {
log.info("---> {} " + String.format(valueMethods.invoke(stepAnnotation).toString().replaceAll("\\{\\S+\\}", "{%s}").replace("(\\?)", ""), as),
stepAnnotation.annotationType().getSimpleName());
}
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e1) {
e1.printStackTrace();
}
}

关于java - 如何使用JDK8和JDK11读取java注释的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60651653/

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