Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用反射访问定义为抽象类型的成员变量的详细信息_Java_Reflection - Fatal编程技术网

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

Java 如何使用反射访问定义为抽象类型的成员变量的详细信息,java,reflection,Java,Reflection,我有一个班级,其形式如下: public class SomeClass { public static AbstractClass<Boolean> variable1 = AbstractClass.create("key", value); } 我想在SomeClass上编写一个测试,它访问所有这些变量[1…],并对它们的“键”执行测试。我该怎么做 这是我的试穿: for (Field field : allFields) { Class<?> targe

我有一个班级,其形式如下:

public class SomeClass {
  public static AbstractClass<Boolean> variable1 = AbstractClass.create("key", value);
}
我想在
SomeClass
上编写一个测试,它访问所有这些变量[1…],并对它们的“键”执行测试。我该怎么做

这是我的试穿:

for (Field field : allFields) {
  Class<?> targetType = field.getType();
  AbstractClass<?> flag = (AbstractClass<?>) field.get(targetType.newInstance());
  assertTrue(flag.getKey().startsWith("xyz"));
for(字段:所有字段){
类targetType=field.getType();
AbstractClass标志=(AbstractClass)field.get(targetType.newInstance());
assertTrue(flag.getKey().startsWith(“xyz”);
显然,使用
newInstance
不能像
targetType
那样工作这里是抽象的,并抛出
InstantiationException

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

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

您迭代的字段是
某个类的,不是吗

如果是这样的话,您必须传递的参数是
SomeClass
的intance,或者如果字段是静态的,则是任何内容,在您的示例中就是这样

 AbstractClass<?> flag = (AbstractClass<?>) field.get(null);
AbstractClass标志=(AbstractClass)字段.get(null);

请注意,最好将其分为两个步骤来检查
字段。get
返回的内容是否是
AbstractClass

的一部分。您可以分享
AbstractClass
的任何实现细节吗?另外,您可以告诉我如何在
for
块中获取
所有字段吗?我不清楚您是否试图对AbstractClass的实例或AbstractClass.class本身进行断言。这就是我访问allFields的方式。
allFields=SomeClass.class.getFields()基本上,
AbstractClass
包含一个键和一个值。我必须检索键并对键进行断言。你的标题没有意义。Java中没有抽象字段。
 AbstractClass<?> flag = (AbstractClass<?>) field.get(null);