2016-09-01 1 views
1

C'est la première fois que j'utilise la réflexion et que je ne sais pas quelle erreur je fais dans l'instanciation du constructeur protégé. Voici mon code pour instancier un constructeur de JsonProcessingException.NoSuchMethodException lors de l'utilisation de la réflexion pour instancier un constructeur protégé

getDeclaredConstructor provoque NoSuchMethodException, bien que cette classe d'exception ait un constructeur protégé avec un, deux et trois paramètres.

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

Mon Assomption: J'ai lu que nous pouvons instancier constructeur privé utilisant la réflexion donc je suppose proteted peut également être instancié.

Répondre

2

Vous devez également considérer les types d'arguments du constructeur non seulement les nombres. Le JsonProcessingException n'a pas un constructeur qui prend deux Object s comme arguments mais un qui prend un String et un JsonLocation ainsi qu'un prenant un String et un Throwable. Pour accéder au second constructeur écrire comme ceci:

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

Voir aussi http://tutorials.jenkov.com/java-reflection/constructors.html

2

Votre approche est presque correcte mais vous essayez de refléter un constructeur inexistant. Vous devez passer la signature correcte par exemple

JsonProcessingException.class 
    .getDeclaredConstructor(String.class, Throwable.class) 
+0

ne passe pas Object.class une manière générique d'obtenir tout constructeur avec seul argument? –

+1

@Vishwanathgowdak non (sauf si le type d'argument est vraiment et 'Object'). vous devez connaître les types d'arguments. Si vous avez besoin d'une correspondance moins stricte, vous devez parcourir 'getDeclaredConstructors()' pour trouver le constructeur qui convient – vsminkov