Wie kann man setAccessible auf "legitime" Verwendungen beschränken?

Je mehr ich über die Kraft vonjava.lang.reflect.AccessibleObject.setAccessibleUmso erstaunter bin ich darüber, was es kann. Dies ergibt sich aus meiner Antwort auf die Frage (Verwenden von Reflection zum Ändern der statischen endgültigen Datei "File.separatorChar" zum Testen von Einheiten).

import java.lang.reflect.*;

public class EverythingIsTrue {
   static void setFinalStatic(Field field, Object newValue) throws Exception {
      field.setAccessible(true);

      Field modifiersField = Field.class.getDeclaredField("modifiers");
      modifiersField.setAccessible(true);
      modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

      field.set(null, newValue);
   }
   public static void main(String args[]) throws Exception {      
      setFinalStatic(Boolean.class.getField("FALSE"), true);

      System.out.format("Everything is %s", false); // "Everything is true"
   }
}

Sie können wirklich unerhörte Dinge tun:

public class UltimateAnswerToEverything {
   static Integer[] ultimateAnswer() {
      Integer[] ret = new Integer[256];
      java.util.Arrays.fill(ret, 42);
      return ret;
   }   
   public static void main(String args[]) throws Exception {
      EverythingIsTrue.setFinalStatic(
         Class.forName("java.lang.Integer$IntegerCache")
            .getDeclaredField("cache"),
         ultimateAnswer()
      );
      System.out.format("6 * 9 = %d", 6 * 9); // "6 * 9 = 42"
   }
}

Vermutlich erkennen die API-Designer, wie missbräuchlichsetAccessible kann sein, muss aber eingeräumt haben, dass es legitimen Gebrauch hat, um es zur Verfügung zu stellen. Meine Fragen sind also:

Wofür sind die wirklich legitimen Verwendungen?setAccessible?Könnte Java so entworfen worden sein, dass es dieses Bedürfnis überhaupt nicht hat?Was wären die negativen Konsequenzen (wenn überhaupt) eines solchen Designs?Können Sie einschränkensetAccessible nur zu legitimen Zwecken?Ist es nur durchSecurityManager?Wie funktioniert es? Whitelist / Blacklist, Granularität, etc?Ist es üblich, dass Sie es in Ihren Anwendungen konfigurieren müssen?Kann ich meinen Unterricht schreiben lassen?setAccessibleunabhängig vonSecurityManager Aufbau?Oder bin ich dem ausgeliefert, der die Konfiguration verwaltet?

Ich denke, eine weitere wichtige Frage ist: MUSS ICH SICH UM DIESES SORGEN ???

Keiner meiner Kurse hat den Anschein einer durchsetzbaren Privatsphäre. Das Singleton-Muster (ohne Zweifel) kann nun nicht mehr durchgesetzt werden. Wie meine obigen Auszüge zeigen, sind selbst einige grundlegende Annahmen über die Funktionsweise von Java nicht annähernd garantiert.

SIND DIESE PROBLEME NICHT WIRKLICH ???

Okay, ich habe gerade bestätigt: Danke ansetAccessibleJava-Strings sindNICHT unveränderlich.

import java.lang.reflect.*;

public class MutableStrings {
   static void mutate(String s) throws Exception {
      Field value = String.class.getDeclaredField("value");
      value.setAccessible(true);
      value.set(s, s.toUpperCase().toCharArray());
   }   
   public static void main(String args[]) throws Exception {
      final String s = "Hello world!";
      System.out.println(s); // "Hello world!"
      mutate(s);
      System.out.println(s); // "HELLO WORLD!"
   }
}

Bin ich der einzige, der meint, dass dies ein RIESIGES Problem ist?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage