¿Cómo restringir a los desarrolladores el uso de la reflexión para acceder a métodos privados y constructores en Java?

¿Cómo restringir a los desarrolladores el uso de la reflexión para acceder a métodos privados y constructores en Java?

Utilizando el código Java normal no podemos acceder a constructores privados o métodos privados fuera de una clase. Pero al usar la reflexión podemos acceder a cualquier método y constructor privado en una clase Java.

Entonces, ¿cómo podemos dar seguridad a nuestro código Java?

Ejecute su aplicación utilizando un SecurityManager y una política de seguridad suficientemente restrictiva.

Hay un breve resumen en el tutorial y amplia información en la documentación de seguridad .

Agregue el método checkPermission() en todo su método / constructor privado. checkPermission usando sun.reflect.Reflection.getCallerClass(int n) por assert callerClass=selfClass .

getCallerClass devuelve la clase del método frames de realFramesToSkip en la stack (basada en cero), ignorando los marcos asociados con java.lang.reflect.Method.invoke() y su implementación. El primer fotogtwig es el asociado a este método, por lo que getCallerClass(0) devuelve el objeto Class para sun.reflect.Reflection .

 public class PrivateConstructorClass { private PrivateConstructorClass() { checkPerMission(); //you own code go below } void checkPerMission() { Class self = sun.reflect.Reflection.getCallerClass(1); Class caller = sun.reflect.Reflection.getCallerClass(3); if (self != caller) { throw new java.lang.IllegalAccessError(); } } } 

Puedes intentar probar el reflection, fallará:

 public class TestPrivateMain { Object newInstance() throws Exception { final Class c = Class.forName("package.TestPrivate"); final Constructor constructor = c.getDeclaredConstructor(); constructor.setAccessible(true); return constructor.newInstance(); } public static void main(String[] args) throws Exception { Object t = new TestPrivateMain().newInstance(); } } 

Usted (como desarrollador del código en cuestión) no puede hacer eso.

El usuario final, que ejecuta la aplicación, podría instalar un SecurityManager que prohíbe la reflexión.