---
title: 'Private Attribute auslesen/ändern und der Typ AccessibleObject'
url: 'https://www.tutego.de/blog/javainsel/2017/02/private-attribute-auslesenaendern-und-der-typ-accessibleobject'
markdown: 'https://www.tutego.de/blog/javainsel/2017/02/private-attribute-auslesenaendern-und-der-typ-accessibleobject.md'
date: '2017-02-19'
description: 'Wenn es der Sicherheitsmanager zulässt, kann ein Programm auch private- oder protected-Attribute ändern und Methoden/Konstruktoren eingeschränkter Sichtbarkeit aufrufen. Die Schlüsselfigur in diesem Spiel ist die Oberklasse java.lang.reflect.AccessibleObject, die den Klassen Field und Excecutable (…'
taxonomy:
  category:
    - Insel
    - 'Java 9'
---

# Private Attribute auslesen/ändern und der Typ AccessibleObject

![Illustration einer tropischen Insel mit Palmen und einem hohen Berg](https://www.tutego.de/blog/javainsel/user/themes/tutego/images/insel-cover.jpg)# Java Blog für Programmierer

[Java Blog für Programmierer](https://www.tutego.de/blog/javainsel/)

## Private Attribute auslesen/ändern und der Typ AccessibleObject

19.02.2017 · [Christian Ullenboom](https://www.tutego.de/blog/javainsel/author/admin/)

Wenn es der Sicherheitsmanager zulässt, kann ein Programm auch private- oder protected-Attribute ändern und Methoden/Konstruktoren eingeschränkter Sichtbarkeit aufrufen. Die Schlüsselfigur in diesem Spiel ist die Oberklasse `java.lang.reflect.AccessibleObject`, die den Klassen Field und Excecutable (und damit Constructor und Method) die Methode `setAccessible(boolean)` vererbt. Ist das Argument `true` und lässt der Sicherheitsmanager die Operation zu, lässt sich auf jedes Element (also Konstruktor, Attribut oder Methode) ungleich der Sichtbarkeitseinstellungen zugreifen:

```java
public class ReadPrivate {

   @SuppressWarnings( "unused" )
   private String privateKey = "Schnuppelhase";

   public static void main( String[] args ) throws Exception {
     ReadPrivate key = new ReadPrivate();
     Class c = key.getClass();
     java.lang.reflect.Field field = c.getDeclaredField( "privateKey" );
     field.setAccessible( true );
     System.out.println( field.get(key) ); // Schnuppelhase
     field.set( key, "Schnuckibutzihasidrachelchen");
     System.out.println( field.get(key) ); // Schnuckibutzihasidrachelchen
   }
 }
```

class `java.lang.reflect`.**AccessibleObject**implements AnnotatedElement

- `void setAccessible(boolean flag)`Nachfolgede Abfragen sollten die Java-Sichtbarkeiten ignorieren. Falls das nicht erlaubt ist, gibt es eine InaccessibleObjectException.
- `final boolean trySetAccessible()`Wie setAccessible(true), nur löst die Methode beim nicht gewährten Zugriff keine InaccessibleObjectException aus, sondern liefert false. Neu in Java 9.

Warnung: Mit dieser Technik lässt sich viel Unsinn anrichten. Es gibt Dinge, die in der Laufzeitumgebung einfach fest sein müssen. Dazu zählen einmal angelegte Strings oder Wrapper-Objekte. Strings sind immutable, weil sie intern in einem privaten char-Feld gehalten werden und es keine Modifikationsmöglichkeiten gibt. Auch Wrapper-Objekte sind, wenn sie einmal mit einem Konstruktor angelegt wurden, nicht über öffentliche Methoden veränderbar. Sie anschließend per Reflection zu modifizieren, bringt große Unordnung, insbesondere bei den gecachten Integer/Long-Wrapper-Objekten, die die statischen `valueOf(…)`-Methoden liefern.

Kategorien: [Insel](https://www.tutego.de/blog/javainsel/category/insel/), [Java 9](https://www.tutego.de/blog/javainsel/category/java-9/)

[← Alle Beiträge](https://www.tutego.de/blog/javainsel/)

---

## Navigation

- Previous: [Schwache Referenzen und Cleaner](https://www.tutego.de/blog/javainsel/2017/02/schwache-referenzen-und-cleaner.md)
- Next: [Der Paketname mit Class#getPackageName()](https://www.tutego.de/blog/javainsel/2017/02/der-paketname-mit-classgetpackagename.md)
