如何使用反射访问定义为抽象类型的成员变量的详细信息



我有一个类别的类:

public class SomeClass {
  public static AbstractClass<Boolean> variable1 = AbstractClass.create("key", value);
}

AbstractClass看起来像这样:

public abstract AbstractClass<T> {
  private String key;
  private T value;
  protected AbstractClass(String key, T value) {
     this.key = key;
     this.value = value;
  }
  protected abstract void func();
  public String getKey() {
    return key;
  }
  public T get() {
    return value;
  }

  public static create(String key, String default) {
    return new AbstractClass<String>(key, default) {
      @Override
      protected void func() {
      }
    };
  }
}

我想在SomeClass上编写一个测试,该测试访问所有此类变量[1 ...]并在其"键"上执行测试。我该怎么做?

这是我的尝试:

for (Field field : allFields) {
  Class<?> targetType = field.getType();
  AbstractClass<?> flag = (AbstractClass<?>) field.get(targetType.newInstance());
  assertTrue(flag.getKey().startsWith("xyz"));

显然,使用newInstance无法正常工作,因为targetType在这里是抽象的,并且投掷InstantiationException

另一种方法是仅访问所有变量变量,变量2等,从静态上访问键,并在其上执行断言。但是,显然,这意味着,如果某人在SomeClass中添加了一个新字段,则有人必须手动修改测试文件并写出断言。这并没有真正的帮助,因为人们可能会忘记编写测试。

所以我认为使用反射可以解决。但是,我认为使用反思是不可能的,所以想知道是否有任何方法可以解决这个问题?另外,任何其他可以自动进行测试的方法,以便测试添加所有字段,而开发人员不必担心它?

您要迭代的字段是 SomeClass'不是吗?

如果是这样,您必须传递以获得其值的参数是SomeClass或任何其他字段静态的意图,实际上在您的示例中是这种情况。

 AbstractClass<?> flag = (AbstractClass<?>) field.get(null);

请注意,最好以两个步骤将其拆分,以检查field.get返回的内容是否是AbstractClass

的意图

最新更新