したがって、たとえばStringBuilder
は抽象クラスAbstractStringBuilder
から継承します。私が理解しているように、StringBuilder
にはフィールド自体はありません(serialVersionUID
を除く)。むしろ、その状態はAbstractStringBuilder
のフィールドで表され、オーバーライドするメソッドの実装でsuper
を呼び出すことによって操作されます。リフレクトを使用して抽象親クラスのインスタンスフィールドにアクセスするにはどうすればよいですか?
StringBuilder
の特定のインスタンスに関連付けられているAbstractStringBuilder
で宣言さvalue
という名前のプライベートchar
配列を取得するためにリフレクションを介した方法はありますか?これは私が得た最も近いものです。
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());
}
}
これは私に16個のヌル文字の配列を取得します。 StringBuilder
に限定されない一般的なテクニックが必要なので、私は反射を含むソリューションを探しています。何か案は?
なぜObjectクラスにvalueというフィールドがあると思いますか? – RoflcoptrException
@Roflcoptr私はそれを考えていません。 'AbstractStringBuilder'は' value'というフィールドを持っています。 – gdejohn
ええとAPIを見ると、StringBuilderはオブジェクトから直接継承します – RoflcoptrException