如何通过反射访问抽象父类中的实例字段?

时间:2010-12-05 22:38:41

标签: java reflection abstract-class

因此,例如,StringBuilder继承自抽象类AbstractStringBuilder。据我了解,StringBuilder本身没有字段(serialVersionUID除外)。相反,它的状态由AbstractStringBuilder中的字段表示,并通过在它覆盖的方法的实现中调用super来操纵。

有没有办法通过反射来获取char中声明的value数组AbstractStringBuilderStringBuilder的特定实例相关联?这是我最接近的。

import java.lang.reflect.Field;
import java.util.Arrays;

public class Test
{
   public static void main(String[ ] args) throws Exception
   {
      StringBuilder foo = new StringBuilder("xyzzy");
      Field bar = foo.getClass( ).getSuperclass( ).getDeclaredField("value");
      bar.setAccessible(true);
      char[ ] baz = (char[ ])bar.get(new StringBuilder( ));
   }
}

这让我得到了一个包含十六个空字符的数组。请注意,我正在寻找涉及反射的解决方案,因为我需要一种不限于StringBuilder的通用技术。有什么想法吗?

2 个答案:

答案 0 :(得分:7)

char[ ] baz = (char[ ])bar.get(new StringBuilder( ));

你的问题是你正在检查一个新的StringBuilder ......所以它当然是空的(16个字符是默认大小)。您需要传递foo

答案 1 :(得分:0)

在Apache Commons BeanUtils库中查找可能是值得的。这是他们API Javadocs的链接。该库包含许多高级方法,使Reflection更易于使用。