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

时间:2016-06-17 19:25:11

标签: java reflection

我有一个类如下:

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

另一种方法是静态访问变量variable1,variable2等所有变量,从中检索密钥,并对其执行断言。但是,显然,这意味着如果有人在SomeClass中添加了一个新字段,则有人必须手动修改测试文件并编写断言。这并没有什么帮助,因为人们可能会忘记编写测试。

所以我认为使用反射可能会解决这个问题。但是,我认为使用反射是不可能的,所以想知道是否有办法解决这个问题? 或者,任何其他的自动化测试,以便测试可以添加所有字段,开发人员不需要担心它?

1 个答案:

答案 0 :(得分:1)

您正在迭代的字段是SomeClass,不是吗?

如果是这样,你必须传递给它的值的参数是SomeClass或者任何东西的intance,如果该字段是静态的,在你的例子中就是这种情况。

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

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

的内容