2010-12-05 9 views
2

したがって、たとえば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に限定されない一般的なテクニックが必要なので、私は反射を含むソリューションを探しています。何か案は?

+0

なぜObjectクラスにvalueというフィールドがあると思いますか? – RoflcoptrException

+0

@Roflcoptr私はそれを考えていません。 'AbstractStringBuilder'は' value'というフィールドを持っています。 – gdejohn

+0

ええとAPIを見ると、StringBuilderはオブジェクトから直接継承します – RoflcoptrException

答えて

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

それは空のコースのように、あなたの問題は...あなたは新しいStringBuilderのを検査しているということです(16文字デフォルトサイズです)。あなたは渡す必要がありますfoo

+0

まあ、私は気になるでしょう。なぜそれが私には起こらなかったのか分かりません。それは動作するように見えます。ありがとうございました。 – gdejohn

+0

これがなぜ機能するのか説明できますか?あるクラスのプライベートフィールドの値を継承しないクラスのサブクラスのインスタンスからそのプライベートフィールドの値を取得する方法はありますか? – gdejohn

+1

プライベートフィールドは依然として子オブジェクトの一部です。標準的な方法では子フィールド内からアクセスできません。面白いことに、プライベートフィールドは実際には*クラス*のプライベートフィールドではなく、*インスタンス* - 私はその1つの背後にある理由を知りたいと思うだろう。 – CurtainDog

0

Apache Commons BeanUtilsライブラリを調べる価値があります。ここにはAPI Javadocsへのリンクがあります。ライブラリには、Reflectionを使いやすくするための多くのハイレベルメソッドが含まれています。