如何从java中的基类访问派生类的字段值?

时间:2013-10-03 09:44:32

标签: java inheritance reflection

我想从java中的基类访问派生类的字段,而不知道字段的名称。 出于什么目的? 我想有一个“表”类来管理数据库表,如INSERT,UPDATE。 我是一个只有字段和值的派生类,在基类中我读取了字段和值,并创建了正确的INSERT或UPDATE命令。

我可以用C#这样做:

for (int count = 0; count < finfo.Length; count++)
{
    value = finfo[count].GetValue(this);
    name = finfo[count].Name;
}

我可以读取字段名称并在java中输入:

for (Field f : getClass().getDeclaredFields()){
    name = f.getName();
}

但我不知道如何阅读该字段的VALUE!

我在许多论坛中以不同的方式提出这个问题,但我没有得到答案! 请帮我。 提前谢谢。

2 个答案:

答案 0 :(得分:5)

给定Field f,您可以使用f.get(object)

读取特定对象中该字段的值
for (Field f : getClass().getDeclaredFields()){
    name = f.getName();
    value = f.get(this);
}

get返回Object - 如果该字段属于基本类型(booleancharint等),则相应的包装器(将返回BooleanCharacterInteger,...)(或者您可以使用特定于类型的getBooleangetChar等方法直接返回原始类型)。 get方法可以抛出各种异常(有些已检查,有些未经检查),您必须正确处理这些异常,有关详细信息,请参阅JavaDoc。

但是要退回到您的具体问题,如果您的目标是将类映射到数据库表,那么有成熟的,经过良好测试的框架可以为您完成所有艰苦工作,例如Hibernate或一个在JPA的许多实现中,我强烈建议您在尝试自己编写之前先查看其中的一个或多个。

答案 1 :(得分:0)

在你的基类中,它将被声明为abstract,你可以声明一个将获得值的抽象方法

public abstract BaseClass{
    protected abstract FieldInfo getFieldInfo(i);

    public void doSomething(){
        for (int count = 0; count < finfo.Length; count++)
        {
            FieldInfo finfo = getFieldInfo(count);
            value = finfo.GetValue(this);
            name = finfo.Name;
        }
    }
}

在您的InheritedClass中,您必须实现它。