¿Cómo limitar setAccessible solo para usos "legítimos"?

Cuanto más aprendí sobre el poder dejava.lang.reflect.AccessibleObject.setAccessible, cuanto más asombrado estoy de lo que puede hacer. Esto está adaptado de mi respuesta a la pregunta (Uso de la reflexión para cambiar File.separatorChar final estático para pruebas unitarias)

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"
   }
}

Puedes hacer cosas realmente escandalosas:

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"
   }
}

Presumiblemente, los diseñadores de API se dan cuenta de lo abusablesetAccessible puede ser, pero debe haber admitido que tiene usos legítimos para proporcionarlo. Entonces mis preguntas son:

¿Cuáles son los usos verdaderamente legítimos parasetAccessible?¿Podría Java haber sido diseñado para NO tener esta necesidad en primer lugar?¿Cuáles serían las consecuencias negativas (si las hubiera) de tal diseño?Puedes restringirsetAccessible solo para usos legítimos?¿Es solo a través deSecurityManager?¿Como funciona? Lista blanca / lista negra, granularidad, etc.¿Es común tener que configurarlo en sus aplicaciones?¿Puedo escribir mis clases para sersetAccessiblea prueba independientemente deSecurityManager ¿configuración?¿O estoy a merced de quien gestiona la configuración?

Supongo que una pregunta más importante es: ¿DEBO PREOCUPARME POR ESTO?

Ninguna de mis clases tiene una apariencia de privacidad exigible. El patrón singleton (dejando de lado las dudas sobre sus méritos) ahora es imposible de aplicar. Como muestran mis fragmentos anteriores, incluso algunas suposiciones básicas de cómo funciona Java fundamental ni siquiera están cerca de estar garantizadas.

¿ESTOS ESTOS PROBLEMAS NO SON REALES?

Bien, acabo de confirmar: gracias asetAccessible, Las cadenas de Java sonNO inmutable.

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!"
   }
}

¿Soy el único que piensa que esto es una ENORME preocupación?

Respuestas a la pregunta(3)

Su respuesta a la pregunta