Java 无法从基类访问字段值
我在Java中有一个名为a的基类和一个名为B的派生类。 我想从A(基类)访问B的私有或公共变量的值。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
我可以用以下代码读取变量名,但不能读取变量值:
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
Dofield.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));
}
}