# per Reflection auf private Klassenattribute zugreifen?



## Guest (4. Okt 2007)

Hallo an alle!

Wie ist es möglich per Reflection API auf private Felder einer Klasse zuzugreifen?

in der Java Insel steht der Begriff "privelegierte Reflection", aber auf diese wird nicht eingegangen.
Versteht jemand etwas unter diesem Begriff und kann mir diese Technik erläutern?

Gruß, chris


----------



## Murray (4. Okt 2007)

AccessibleObject#setAccessible( boolean)
Damit kann man Field-, Method- und Constructor-Objekte unabhängig von ihrer definierten Sichtbarkeit zugreifbar machen (sofern das nicht durch den SecurityManager unterbunden wird)


----------



## Guest (4. Okt 2007)

Also muss ich zB im Konstruktor der Klasse des Objektes auf das ich zugreifen will,
die Felder auf accessible setzen, richtig?

also gibt es keine möglichkeit einfach per reflection das ganze zu machen um eine dynamische lösung zu erstellen?
ich muss ja in diesem sinne "hardgecoded" setAccessible einfügen.


----------



## Wildcard (4. Okt 2007)

Hmm?
getDeclaredFields +setAccessible(true)
Wozu brauchst du das überhaupt?


----------



## Guest (4. Okt 2007)

Anonymous hat gesagt.:
			
		

> Also muss ich zB im Konstruktor der Klasse des Objektes auf das ich zugreifen will,
> die Felder auf accessible setzen, richtig?


Nein. Du kannst es auch per Reflection machen.

Hie ein etwas sinnfreies Beispiel. Elemente von ArrayList werden vertauscht.


```
try
{
   List<String> list = new ArrayList<String>(2);
   list.add("A");
   list.add("B");
   System.out.println(list);
   
   Class<?> clazz = list.getClass();         
   Field listField = clazz.getDeclaredField("elementData");
   listField.setAccessible(true);
   
   Object[] elementData = (Object[])listField.get(list);
   Object tmp = elementData[0];
   elementData[0] = elementData[1];
   elementData[1] = tmp;
   
   listField.setAccessible(false);
   System.out.println(list);
}
catch (Exception e)
{
   e.printStackTrace();
}
```


----------



## Guest (4. Okt 2007)

Wildcard hat gesagt.:
			
		

> Hmm?
> getDeclaredFields +setAccessible(true)
> Wozu brauchst du das überhaupt?




Ich hab mich mit shallow und deep copies beschäftigt.. und mir überlegt, 
dass ich eine allgemeine Funktion für deep copies schreiben kann mittel der refelction api, 
die rekusiv alle attribute clont sofern sie keine primären variablentypen sind.
 :bae:


----------



## Marco13 (4. Okt 2007)

Viel Glück :wink:


----------



## Wildcard (4. Okt 2007)

Zu spät:
http://www.java-forum.org/de/viewtopic.php?t=32892&postdays=0&postorder=asc&start=0


----------



## byte (4. Okt 2007)

Da war schon jemand schneller: http://www.java-forum.org/de/viewtopic.php?t=32892&highlight=deep+copy



Edit: Verdammt! Da war noch jemand schneller! :autsch:


----------



## SnooP (6. Okt 2007)

wobei... kleine Anmerkung von mir  ... das Ding hat in der Form, wie es da liegt noch kleinere Bugs mit Arrays. Das ist mir leider erst recht spät aufgefallen. Aber nix, was sich nicht beheben ließe...

ich weiß auch nicht mehr, ob die version schon performance-technisch am Ende war... Probleme gibt es nämlich mit dem Instanzieren von Klassen ohne parameterlosen Konstruktor - das ist relativ langsam, Sun bietet dafür ne entsprechende klasse an, ich weiß allerdings nicht, ob die in der Version hier schon eingebaut ist... - einfach mal gucken 

ansonsten ist das ne ganz nette Aufgabe  - insbesondere das performant hinzubekommen und am Ende hat man viel über Reflections gelernt


----------

