当前位置: 首页 > 知识库问答 >
问题:

注释-使用反射读取元素值[重复]

皇甫喜
2023-03-14

是否可以使用反射读取注释元素的值?我想使用元素名称的字符串来访问元素的值。这可能吗?

注释:

import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Retention(RUNTIME)
@Target({CONSTRUCTOR, METHOD, TYPE})
public @interface TestCase {
    String brand1() default "";
    String brand2() default "";
    String brand3() default "";
}

示例用法:

@TestCase(brand1 = "1001", brand2 = "1101", brand3 = "1201")
@Test
public void testStep() {
    // run test here
}

我目前使用开关提取元素的值:

TestCase testCase = iInvokedMethod.getTestMethod().getConstructorOrMethod().getMethod().getAnnotation(TestCase.class);
switch (Brand brand) { // Brand is an enum value
    case BRAND1:
        testCaseId = testCase.brand1();
        break;
    case BRAND2:
        testCaseId = testCase.brand2();
        break;
    case BRAND3:
        testCaseId = testCase.brand3();
        break;
    default:
        testCaseId = "";
}

我想做这样的事情:

String sbrand = brand.toString.toLowerCase() // brand is an enum value
String s = iInvokedMethod.getTestMethod().getConstructorOrMethod().getMethod()
        .getAnnotation(TestCase.class).[iCantFigureThisPartOut](sbrand);

我尝试了:

String s = iInvokedMethod.getTestMethod().getConstructorOrMethod().getMethod()
        .getAnnotation(TestCase.class).getClass().getField("brand1").toString();

我得到了一个NoSuchFieldException:

java.lang.NoSuchFieldException: brand1
    at java.base/java.lang.Class.getField(Class.java:1956)

我试过这些,看看能不能买到什么:

Field[] fs = testCase.getClass().getFields();
Field[] dfs = testCase.getClass().getDeclaredFields();
Method[] ms = testCase.getClass().getMethods();
Method[] dms = testCase.getClass().getDeclaredMethods();

但是当我遍历并执行System.out.println()时,看起来唯一有用的是getDeclaredMethod()的输出:

public final boolean com.sun.proxy.$Proxy3.equals(java.lang.Object)
public final java.lang.String com.sun.proxy.$Proxy3.toString()
public final int com.sun.proxy.$Proxy3.hashCode()
public final java.lang.Class com.sun.proxy.$Proxy3.annotationType()
public final java.lang.String com.sun.proxy.$Proxy3.brand1()
public final java.lang.String com.sun.proxy.$Proxy3.brand2()
public final java.lang.String com.sun.proxy.$Proxy3.brand3()

共有1个答案

华易安
2023-03-14

对你差点就成功了。一旦你到达这一部分:

iInvokedMethod.getTestMethod().getConstructorOrMethod().getMethod()
    .getAnnotation(TestCase.class)

它为您提供了一个继承TestCase注释的对象。

TestCase tc = iInvokedMethod.getTestMethod().getConstructorOrMethod().getMethod()
    .getAnnotation(TestCase.class);
String b1 = tc.brand1(); // returns the value "1001" from your example
String b2 = tc.brand2(); // returns the value "1101" from your example
String b3 = tc.brand3(); // returns the value "1201" from your example

编辑:添加其他方法@SotiriosDelimanolis说。

TestCase tc = iInvokedMethod.getTestMethod().getConstructorOrMethod().getMethod()
    .getAnnotation(TestCase.class);
Method fm = TestCase.class.getMethod("brand1"); // or brand2 or a variable
String brand = (String) fm.invoke(tc); // returns the value "1001" from your example
 类似资料:
  • 我知道如果我们知道注释类,我们可以很容易地获得特定的注释并访问其属性。例如: 它将返回特定注释接口的引用,因此您可以轻松访问其值。 我的问题是,我是否对特定的注释类没有预先了解。我只想在运行时使用反射来获取所有注释类名及其属性,以便将类信息转储为例如JSON文件。我怎样才能以简单的方式做到这一点。 此方法将仅返回注释接口的动态代理。

  • 问题内容: 我知道如果知道注释类,就可以轻松获取特定注释并访问其属性。例如: 它将返回特定注释接口的引用,因此您可以轻松访问其值。 我的问题是,我是否对特定的注释类不了解。我只想使用反射在运行时获取所有注释类名称及其属性,以将类信息转储为例如JSON文件的目的。我该如何轻松地做到这一点。 此方法将仅返回注释接口的动态代理。 问题答案: 与预期的相反,注释的元素不是属性-它们实际上是返回提供的值或默

  • 我试图映射一个bean,其中包含一些JAXB元素,如@XmlSee同样、@XmlElement、@XmlschemaType作为该类的属性。 现在,我面临着下面的问题时,使用mapSTRt映射。 > bean个人客户没有被映射。我没有在响应中看到它。但是当使用dozer时,它工作得很好。我所需要做的就是在dozer配置xml中的映射中定义它。我在mapSTRt中尝试了类似的事情。我在mapper接

  • 问题内容: 我需要知道如何在运行时阅读Javadoc注释(可能是通过反射吗?) 说我有以下功能: 在运行时,我可以通过反射获得有关此函数的更多信息。但是无法阅读注释。所以问题是,如何在运行时阅读此 javadoc 注释。 问题答案: 考虑使用注释而不是Javadoc并编写注释处理器。

  • 对于下面的Page对象示例类,我有一个accountsLink私有成员,它在加载时映射到登录页面上的非动态元素。当从构造函数调用initElements方法时,使用FindBy批注对其进行初始化。 现在问题来了。我有另一个元素(signInButton),它只在您单击accountsLink元素时才动态加载。此操作不会将您带到另一个页面,而只会打开一个ajax菜单,其中会出现登录按钮。 我的问题是

  • 问题内容: 我正在尝试映射一个具有一些JAXB元素(如@ XmlSeeAlso,@ XmlElement,@ XmlSchemaType)作为该类属性的bean。 现在,当使用mapStruct映射时,我面临以下问题。 Bean PersonalCustomer没有被映射。我没有在回复中看到它。但是在使用推土机时它可以完美地工作。我需要做的就是在dozer config xml中的映射中定义它。我