2012-02-20 21 views
8

Tengo un método de utilidad para encontrar método de obtención de un objeto para un campo determinado (utilizando la reflexión):Cómo hacer Class.getMethod() lanzar una SecurityException

public static Method findGetter(final Object object, final String fieldName) { 
    if(object == null) { 
     throw new NullPointerException("object should not be null"); 
    } else if(fieldName == null) { 
     throw new NullPointerException("fieldName should not be null"); 
    } 

    String getterName = getMethodNameForField(GET_PREFIX, fieldName); 

    Class<?> clazz = object.getClass(); 
    try { 
     return clazz.getMethod(getterName); 
    } catch(final NoSuchMethodException e) { 
     // exception handling omitted 
    } catch(final SecurityException e) { 
     // exception handling omitted 
    } 
} 

me gustaría escribir una prueba de que la unidad cubre el escenario SecurityException, pero ¿cómo puedo hacer que getMethod arroje una SecurityException?

Los estados javadoc que getMethod tirará SecurityException

Si un administrador de seguridad, s, está presente y cualquiera de las siguientes condiciones se cumple:

  • invocación de s.checkMemberAccess (esto, Member.PUBLIC) niega el acceso al método

  • el cargador de clases de la persona que llama no es el mismo que un antepasado de la clase l ALA DE RUEDAS para la clase actual y la invocación de s.checkPackageAccess() niega el acceso al paquete de esta clase

yo preferiría para desencadenar la excepción normalmente, en lugar de recurrir a un marco de burla.

Respuesta

11
System.setSecurityManager(new SecurityManager(){ 
    @Override 
    public void checkMemberAccess(Class<?> clazz, int which) { 
     throw new SecurityException("Not allowed") 
    } 
    @Override 
    public void checkPermission(Permission perm) { 
     // allow resetting the SM 
    } 
}); 
ClassTest.class.getMethod("foo"); 

recuerde llamar System.setSecurityManager(null) en un bloque finally para restaurar el estado original.

+0

Gracias @Bozho! Es un escenario muy poco probable, pero es bueno poder realizar pruebas fácilmente. –

0

En cuanto a causar esto en una configuración regular, hay muy pocos casos donde esto puede suceder.

Los métodos no públicos darán como resultado NoSuchMethodException, porque getMethod busca únicamente métodos públicos. getDeclaredMethod encontrará el método, pero permite que se devuelvan métodos privados/protegidos.

La única manera real de hacerlo es, como dicen los javadocs, tener un paquete separado que esté protegido por el administrador de seguridad, que supongo que solo se puede hacer con applets sin firmar o permisos similares. (Nunca me he encontrado con esto, por lo que no estoy del todo seguro)

Lo mejor que puede hacer es forzar la excepción de métodos específicos anulando el administrador de seguridad.

Cuestiones relacionadas