reflexion privada por poo palabra modificadores metodo invocar ejemplos ejemplo clase acceso java security reflection

privada - reflection java 8



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

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 pila (basada en cero), ignorando los marcos asociados con java.lang.reflect.Method.invoke() y su implementación. El primer fotograma 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 reflejo, 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(); } }

¿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?


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.