Как я могу получить доступ к полю экземпляра в абстрактном родительском классе через отражение? - PullRequest
2 голосов
/ 06 декабря 2010

Так, например, StringBuilder наследуется от абстрактного класса AbstractStringBuilder.Насколько я понимаю, StringBuilder сама по себе не имеет полей (кроме serialVersionUID).Скорее, его состояние представлено полями в AbstractStringBuilder и управляется с помощью вызова super в реализациях переопределяемых им методов.

Есть ли способ через отражение получить закрытый массив charvalue объявлено в AbstractStringBuilder, которое связано с конкретным экземпляром StringBuilder?Это самое близкое, что у меня есть.

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 ]

7 голосов
/ 06 декабря 2010
char[ ] baz = (char[ ])bar.get(new StringBuilder( ));

Ваша проблема в том, что вы проверяете новый StringBuilder ... поэтому, конечно, он пуст (и 16 символов - это размер по умолчанию).Вам нужно пройти в foo

0 голосов
/ 06 декабря 2010

Возможно, стоит поискать в библиотеке Apache Commons BeanUtils. Вот ссылка на их API Javadocs . Библиотека содержит множество высокоуровневых методов, облегчающих использование Reflection.

...