我有以下两节课

public abstract class A {
    public String p1;
    public String p2;

    // Includes getters/setters
}

public class B extends A {
    public String p3;
    public String p4;

    // Some implementation to populate base class attributes
    // Includes getters/setters
}

public static void main(String[] args) {

    // Initializing and populating parameters for B
    
    System.out.println(B.getP1());
    System.out.println(B.getP2());
}

如何打印基类B的所有元素,而不为main中的属性调用单独的getter.因为将来类A有可能具有将需要在main中为该属性再次使用Getter方法附加属性.我只想打印基类中的所有属性.

推荐答案

您应该能够通过使用反射迭代基类的属性来做到这一点.

import java.lang.reflect.Field;

class           B {private String p1="1"; private String p2="2";}
class A extends B {private String p3="3"; private String p4="4";}

public class Scratch    {
    static void showFields(Class clazz, Object obj) throws Exception {
        for(Field f:clazz.getDeclaredFields())  {
            f.setAccessible(true);
            System.out.println("Field "+f.getName()+" had value "+f.get(obj));
        }
    }

    public static void main(String[] args) throws Exception  {
        System.out.println("Fields defined in parent: ");
        showFields(B.class, new A());
        System.out.println("Fields defined in child");
        showFields(A.class, new A());
    }
}

所以我测试了它,它对我很有效--但我运行的是Java 8.我只是稍微查看了一下,看起来他们可能会在更高的版本中删除设置Accessable的功能(或者可能只是从核心Java类中删除). 需要体验).

另一种可能性是从公共方法而不是成员读取.使用getDeclaredMethods()而不是getDeclaredFields(),您的数组必须是方法array.不是调用.get(Obj),而是调用.Invoke(Obj).确保该方法没有接受任何参数(getter不接受参数),方法对象中有一个参数计数,它将告诉您它是否接受参数.如果您从这段代码开始,不要忘记将getter添加到A和B中.

只要getter方法是公共的,这应该是可行的.至少这段代码应该给您一些开始的地方.

请让我知道这是如何为你工作的,我很快就必须向前迁移很多代码,如果这不再起作用,它将变得更加困难.

Java相关问答推荐

如何为具有多对多关系的实体的给定SQL查询构建JPA规范?

如何将kotlin代码转换为java

我的scala文件失败了Scala.g4 ANTLR语法

获取字符串中带空格的数字和Java中的字符

使用Mockito进行的Junit测试失败

解释左移在Java中的工作原理

将响应转换为带值的键

使用PDFBox从PDF中删除图像

如何将其他属性引用到log4j2 yaml配置中?

在向WebSphere中的文档添加元素时iText挂起

扩展视图高度,并将其拖动到较低的视图上,而不是将其向下推?

为什么有两种实现来检索数组类的组件类型?

在不使用instanceof或强制转换的情况下从父类变量调用子类方法

Java.time.OffsetDateTime的SQL Server数据库列类型是什么?

Intellij 2023 IDE:始终在顶部显示菜单栏

spring 更新多项管理关系

使用DynamoDB增强客户端时未更新属性

如何在Java中正确实现填字游戏求解器

单例模式中热切初始化和惰性初始化的区别

找到差异最小的回文