java—如何使用反射或库从超类获取子类的私有字段的名称?

oknwwptz  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(378)

假设我有这样的代码结构:

public abstract class A {
 // members
 ...

 // constructor
 ...

 // methods
 protected void enterValue(By locator, String value) {
  ...
  System.out.println("entered " + value + " into the " + locator...);
 }
}

public class B extends A {
 // members
 private final By SEARCH_FIELD = By.id("search");
 // ... other FIELD members

 // constructor
 ...

 // methods
 public void searchProduct(String product) {
  enterValue(SEARCH_FIELD, product);
  ...
 }
}

entervalue(by,string)方法应该打印例如:“entered talent into the search\ u field”。
另外,我可以有与类b相同结构的其他类,它们可以调用类a方法,所以我不知道子类的类名,也不知道它将是哪个字段。
这是我用java反射或一些库可以实现的吗?
我的目标是将每个具有有意义名称的操作都记录到extentreports中。

ccrfmcuu

ccrfmcuu1#

正如我在评论中提到的,我会寻求一个不同的解决方案。
通常,对于类似的问题,我使用一种抽象方法:

public abstract class A {

    protected abstract String getLocatorName();

    protected void enterValue(String value) {
        System.out.println("entered " + value + " into the " + getLocatorName() + "...");
    }
}

在子类中实现:

public class B extends A {

    private static final String LOCATOR_NAME = "SEARCH_FIELD";
    private final By searchField = By.id("search");

    public void searchProduct(String product) {
        enterValue(product);
    }

    @Override
    protected String getLocatorName() {
        return LOCATOR_NAME;
    }
}
avkwfej4

avkwfej42#

getDeclaredFields()Class 给出类中所有声明的字段(public和private)。它不会返回继承的字段。您可以使用修饰符检查它是否私有。

List<Field> privateFieldList = new ArrayList<>();
Field[] Fields = SomeClass.class.getDeclaredFields();
for (Field field : Fields) {
    if (Modifier.isPrivate(field.getModifiers())) {
        privateFieldList.add(field);
    }
}

使用field.gettype()检查类型

相关问题