Java 无法从基类访问字段值

Java 无法从基类访问字段值,java,class,reflection,Java,Class,Reflection,我在Java中有一个名为a的基类和一个名为B的派生类。 我想从A(基类)访问B的私有或公共变量的值。 我可以用以下代码读取变量名,但不能读取变量值: protected void loadValues() { Field[] fields = this.getClass().getDeclaredFields(); for(Field field:fields){ try { xLog.info(fi

我在Java中有一个名为a的基类和一个名为B的派生类。 我想从A(基类)访问B的私有或公共变量的值。
我可以用以下代码读取变量名,但不能读取变量值:

protected void loadValues()
    {
        Field[] fields = this.getClass().getDeclaredFields();
        for(Field field:fields){
            try {
                xLog.info(field.getName()+"-"+field.get(this).toString());
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
错误是: 不允许访问字段

我可以用C#轻松地做这件事。我如何在java中做到这一点? 以下是我在C#中的做法:

private void loadValues()
{
foreach(GetType().GetFields()中的变量项)
{
类型类型=item.FieldType;
对象值=item.GetValue(此);
Add(新元组(item.Name、type、value));
}
}

您必须使用
field.setAccessible(true)在访问字段之前

例如:

公共静态A类{
public void test()引发异常{
Field[]fields=this.getClass().getDeclaredFields();
用于(字段:字段){
字段。setAccessible(true);
System.out.println(field.getName()+“-”+field.get(this.toString());
}
}
}
公共静态类B扩展了{
私有字符串foo=“bar”;
公共B()抛出异常{
超级();
test();
}
}
公共静态void main(字符串[]args)引发异常{
新B();
}
印刷品:

foo-bar

Do
field.setAccessible(true)

而且,在Java中实现这样的循环依赖关系之前,请仔细考虑一下。像这样反转继承真的是解决问题的最佳方法吗


反射是一种强大的工具,但通常有一种相当不干净的溶液的气味。

请您为我的目的提供一种解决方案好吗?我希望实体的类只包含INSER、UPDATE的字段而不是方法。我想使用派生类的字段和值在基类中创建插入、更新方法。你对此有什么解决方案或建议吗?关于这方面的成分如何?实体不应插入/更新自身。persister类可以为每个实体都这样做(在那里使用反射,或者使用现有的持久性框架,可能是基于JPA的Hibernate)。如果您需要的话,这将使您的实体具有真正的继承关系。请记住,Java不支持从几个基类扩展。还有一个小问题,如果foo没有变量,将抛出一个执行选项。如何处理这个问题?@ehsanshirzadi你说没有变量是什么意思?你是说没有设定值吗?在这种情况下,您必须检查
字段。get(this)
不返回
null
。这是我的错误,我的意思是没有值。如果在FOO中没有值,将引发异常。是的,将引发
NullPointerException
,因为您正在对返回值使用
.toString()
。在调用
.toString()
之前,必须检查
字段.get(this)
是否未返回
null
   private void loadValues()
    {
        foreach (var item in GetType().GetFields())
        {
            Type type = item.FieldType;
            object value = item.GetValue(this);
            fields.Add(new Tuple<string, Type, object>(item.Name, type, value));
        }
    }