Esta es la primera vez que uso el reflejo y no sé qué error estoy cometiendo al crear una instancia del constructor protegido. A continuación se muestra mi código para crear una instancia de un constructor de JsonProcessingException.

GetDeclaredConstructor está causando NoSuchMethodException, aunque esta clase de excepción tiene un constructor protegido con uno, dos y tres parámetros.

final Constructor<JsonProcessingException> constructor = 
    JsonProcessingException.class
        .getDeclaredConstructor(Object.class, Object.class);
constructor.setAccessible(true);

Mi suposición: he leído que podemos crear una instancia de un constructor privado mediante la reflexión, por lo que supongo que también se puede crear una instancia del protegido.

2
Vishwanath gowda k 1 sep. 2016 a las 15:27

2 respuestas

La mejor respuesta

También debes considerar los tipos de argumentos del constructor, no solo los números. La JsonProcessingException no no tener un constructor que tome dos Object como argumentos, sino uno que tome un String y un JsonLocation, así como otro que tome un String y un Throwable . Para acceder al segundo constructor escríbalo así:

final Constructor<JsonProcessingException> constructor = 
    JsonProcessingException.class
        .getDeclaredConstructor(new Class[]{String.class, Throwable.class});
constructor.setAccessible(true);
JsonProcessingException ex = constructor.newInstance(msg, throwable);

Consulte también http://tutorials.jenkov.com/java-reflection/constructors.html

3
hotzst 1 sep. 2016 a las 12:36

Su enfoque es casi correcto pero está tratando de reflejar un constructor inexistente. Tienes que pasar la firma correcta por ejemplo

JsonProcessingException.class
    .getDeclaredConstructor(String.class, Throwable.class)
3
vsminkov 1 sep. 2016 a las 12:30