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

Java-从对象中获取具有公共超级类的字段列表

蒋奕
2023-03-14

我想从一个对象中获得一个具有公共超级类的字段列表,然后迭代它们并执行超级类中存在的方法。示例:

class BasePage{
***public void check(){}***
}

class Page extends BasePage{
    private TextElement c;
    private ButtonElement e;

    //methods acting on c and e
}

class TextElement extends BaseElement {

}

class ButtonElement extends BaseElement {

}

class BaseElement {
    public void exits(){};
}

所以从BasePage类,我想实现检查方法,它应该解析一个页面的字段列表,然后得到具有超级类basElement的字段列表,然后为每个启动方法存在。我确认它不是反射私人领域的复制品

共有1个答案

宗政松
2023-03-14

下面的代码应该满足您的期望。我已经在注释中标记了代码的作用和工作方式。

public static void main(String[] args) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
    Page page = new Page();
    Collection<Field> fields = getFieldsWithSuperclass(page.getClass(), BaseElement.class);
    for(Field field : fields) { //iterate over all fields found
        field.setAccessible(true);
        BaseElement fieldInstance = (BaseElement) field.get(pageCreated); //get the instance corresponding to the field from the given class instance
        fieldInstance.exists(); //call the method
    }
}

private static Collection<Field> getFieldsWithSuperclass(Class instance, Class<?> superclass) {
    Field[] fields = instance.getDeclaredFields(); //gets all fields from the class

    ArrayList<Field> fieldsWithSuperClass = new ArrayList<>(); //initialize empty list of fields
    for(Field field : fields) { //iterate over fields in the given instance
        Class fieldClass = field.getType(); //get the type (class) of the field
        if(superclass.isAssignableFrom(fieldClass)) { //check if the given class is a super class of this field
            fieldsWithSuperClass.add(field); //if so, add it to the list
        }
    }
    return fieldsWithSuperClass; //return all fields which have the fitting superclass
}
 类似资料:
  • 我正在尝试从Java切换到Kotlin。但我有很多遗留代码和第三方库。我看到,Java类中经常存在没有getter和setter的公共字段,这些字段必须从其他类访问。如果没有Kotlin代码中的getter,我如何访问Java类的公共字段?

  • 问题内容: 我有一类称为具有可变的。 我想退出具有最大变量的。 我知道可以通过编写一个自定义比较器并使用来完成此操作,但是我想知道在Java 8中是否可以通过使用自定义比较器来完成此操作,因为我只想使用一个最长日期仅出现在我的代码中的某个位置,并且该类不应始终使用变量来比较实例。 问题答案: 并且Contact类不应该总是使用lastUpdated变量来比较实例 因此,每当要按实例的属性比较多个实

  • 我有两个Coll对象流,我想在实例变量say的基础上找到公共对象。我需要使用Java8流来实现这一点。此外,我需要更新变量,比如说公共元素的乘数为1000。 } 我在写一些东西,比如: 我在这个方法上做错了!!我猜Java8不支持像equals那样带有参数的方法!! 我收到一个编译错误:

  • 问题内容: 在我多年的编程工作中,我经常创建一些类,这些类仅将一些变量与其设置器和获取器组合在一起。我已经看到了这些类型的对象,这些对象称为值对象,域对象或模型对象,具体取决于使用它们的上下文。通用用法最合适的术语似乎是数据传输对象(DTO)。这描述了仅包含访问器和更改器的POJO。 我刚刚编写了一个这样的对象,其中包含大约五十个用于在图表上设置主题参数的字段。现在,我想知道是否应该将这些字段声明

  • 我试图找到一种很好的方法来迭代并打印出ArrayList中的对象。 问题是我似乎无法到达用户键入对象信息(例如颜色和品牌)的字段。 对象的新实例如下所示: 汽车(以及自行车、公共汽车等其他类别)是汽车的子类。 车辆等级: } 汽车等级: }尝试迭代对象时: 当迭代对象时,我希望达到I.color中的颜色和品牌字符串。但是我猜想,由于我是一个新的对象,它可能无法访问与汽车、公共汽车等相关的字段和方法

  • 问题内容: 在Java中将顶级类设为非公开的原因是什么? 假设我们有,可能有 要么 我知道在前面的示例中会出现一些类可见性问题(可能不会从其他包中看到)。但是,无论如何,有人出于某些原因想要执行第一个代码示例中的操作吗? UPD:我在以前的解决方案中看到了什么缺点:没有人关心它是。该类可以稍后在同一包中由其他某个类简单地扩展,那么该类的非公共部分可能会给您带来可见性/访问性问题。 问题答案: 这是