{"id":3611,"date":"2017-02-19T21:16:13","date_gmt":"2017-02-19T19:16:13","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=3611"},"modified":"2017-02-19T21:16:13","modified_gmt":"2017-02-19T19:16:13","slug":"private-attribute-auslesenaendern-und-der-typ-accessibleobject","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2017\/02\/private-attribute-auslesenaendern-und-der-typ-accessibleobject\/","title":{"rendered":"Private Attribute auslesen\/\u00e4ndern und der Typ AccessibleObject"},"content":{"rendered":"<p>Wenn es der Sicherheitsmanager zul\u00e4sst, kann ein Programm auch private- oder protected-Attribute \u00e4ndern und Methoden\/Konstruktoren eingeschr\u00e4nkter Sichtbarkeit aufrufen. Die Schl\u00fcsselfigur 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\u00e4sst der Sicherheitsmanager die Operation zu, l\u00e4sst sich auf jedes Element (also Konstruktor, Attribut oder Methode) ungleich der Sichtbarkeitseinstellungen zugreifen:<\/p>\n<pre>public\u00a0class\u00a0ReadPrivate\u00a0{\n \n \u00a0\u00a0@SuppressWarnings(\u00a0\"unused\"\u00a0)\n \u00a0\u00a0private\u00a0String\u00a0privateKey\u00a0=\u00a0\"Schnuppelhase\";\n \n \u00a0\u00a0public\u00a0static\u00a0void\u00a0main(\u00a0String[]\u00a0args\u00a0)\u00a0throws\u00a0Exception\u00a0{\n \u00a0\u00a0\u00a0\u00a0ReadPrivate\u00a0key\u00a0=\u00a0new\u00a0ReadPrivate();\n \u00a0\u00a0\u00a0\u00a0Class&lt;?&gt;\u00a0c\u00a0=\u00a0key.getClass();\n \u00a0\u00a0\u00a0\u00a0java.lang.reflect.Field\u00a0field\u00a0=\u00a0c.getDeclaredField(\u00a0\"privateKey\"\u00a0);\n \u00a0\u00a0\u00a0\u00a0field.setAccessible(\u00a0true\u00a0);\n \u00a0\u00a0\u00a0\u00a0System.out.println(\u00a0field.get(key)\u00a0);\u00a0\/\/\u00a0Schnuppelhase\n \u00a0\u00a0\u00a0\u00a0field.set(\u00a0key,\u00a0\"Schnuckibutzihasidrachelchen\");\n \u00a0\u00a0\u00a0\u00a0System.out.println(\u00a0field.get(key)\u00a0);\u00a0\/\/\u00a0Schnuckibutzihasidrachelchen\n \u00a0\u00a0}\n }<\/pre>\n<p>class java.lang.reflect.<strong>AccessibleObject<\/strong><br \/>\nimplements AnnotatedElement<\/p>\n<ul>\n<li>void setAccessible(boolean flag)<br \/>\nNachfolgede Abfragen sollten die Java-Sichtbarkeiten ignorieren. Falls das nicht erlaubt ist, gibt es eine InaccessibleObjectException.<\/li>\n<li>final boolean trySetAccessible()<br \/>\nWie setAccessible(true), nur l\u00f6st die Methode beim nicht gew\u00e4hrten Zugriff keine InaccessibleObjectException aus, sondern liefert false. Neu in Java 9.<\/li>\n<\/ul>\n<p>Warnung:\u00a0Mit dieser Technik l\u00e4sst sich viel Unsinn anrichten. Es gibt Dinge, die in der Laufzeitumgebung einfach fest sein m\u00fcssen. Dazu z\u00e4hlen einmal angelegte Strings oder Wrapper-Objekte. Strings sind immutable, weil sie intern in einem privaten char-Feld gehalten werden und es keine Modifikationsm\u00f6glichkeiten gibt. Auch Wrapper-Objekte sind, wenn sie einmal mit einem Konstruktor angelegt wurden, nicht \u00fcber \u00f6ffentliche Methoden ver\u00e4nderbar. Sie anschlie\u00dfend per Reflection zu modifizieren, bringt gro\u00dfe Unordnung, insbesondere bei den gecachten Integer\/Long-Wrapper-Objekten, die die statischen valueOf(\u2026)-Methoden liefern.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn es der Sicherheitsmanager zul\u00e4sst, kann ein Programm auch private- oder protected-Attribute \u00e4ndern und Methoden\/Konstruktoren eingeschr\u00e4nkter Sichtbarkeit aufrufen. Die Schl\u00fcsselfigur 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\u00e4sst der Sicherheitsmanager die Operation zu, l\u00e4sst sich [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11,85],"tags":[],"class_list":["post-3611","post","type-post","status-publish","format-standard","hentry","category-insel","category-java-9"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=3611"}],"version-history":[{"count":3,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3611\/revisions"}],"predecessor-version":[{"id":3614,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3611\/revisions\/3614"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=3611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=3611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=3611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}