2010-12-05 4 views
2

So erbt zum Beispiel StringBuilder von der abstrakten Klasse AbstractStringBuilder. Wie ich es verstehe, hat StringBuilder keine Felder selbst (außer für serialVersionUID). Vielmehr wird sein Zustand durch die Felder in AbstractStringBuilder dargestellt und durch Aufruf von super in den Implementierungen der Methoden, die er überschreibt, manipuliert.Wie kann ich über Reflektion auf ein Instanzfeld in einer abstrakten Elternklasse zugreifen?

Gibt es eine Möglichkeit über Reflektion des privaten char Array value in AbstractStringBuilder erklärt genannt zu bekommen, die mit einer bestimmten Instanz StringBuilder verbunden ist? Das ist das nächste, was ich habe.

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()); 
    } 
} 

Das bringt mir ein Array von sechzehn Null-Zeichen. Beachten Sie, dass ich nach Lösungen mit Reflektion suche, da ich eine allgemeine Technik brauche, die nicht auf StringBuilder beschränkt ist. Irgendwelche Ideen?

+0

Warum denken Sie, dass die Object-Klasse ein Feld namens Wert hat? – RoflcoptrException

+0

@Roflcoptr Das glaube ich nicht. 'AbstractStringBuilder' hat ein Feld namens' value'. – gdejohn

+0

Hmm Wenn ich in der API suche, erbt StringBuilder direkt vom Objekt – RoflcoptrException

Antwort

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

Ihr Problem ist, dass Sie einen neuen String sind Inspektion ... so natürlich ist es leer (und 16 Zeichen ist die Standardgröße). Sie müssen übergeben foo

+0

Nun, ich werde verdammt sein. Ich bin mir nicht sicher, warum es mir nicht einfiel, das zu versuchen. Sieht so aus, als ob es funktioniert. Vielen Dank. – gdejohn

+0

Können Sie erklären, warum das funktioniert? Wie können Sie den Wert eines privaten Feldes in einer Klasse von einer Instanz einer Unterklasse dieser Klasse erhalten, die sie nicht erbt? – gdejohn

+1

Das private Feld ist immer noch Teil des Child-Objekts, es ist einfach nicht vom Standard aus mit dem Kind erreichbar. Als eine interessante Nebensache, ein privates Feld ist eigentlich privat für die * Klasse * nicht die * Instanz * - ich würde gerne wissen, warum dahinter. – CurtainDog

0

Es könnte sich lohnen, in der Apache Commons BeanUtils-Bibliothek zu suchen. Hier ist der Link zu ihrem API Javadocs. Die Bibliothek enthält viele übergeordnete Methoden, mit denen Reflection einfacher zu verwenden ist.

Verwandte Themen