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.
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 .