J'ai un ENUM avec classe interne anonyme comme:Java enum classe interne anonyme et de réflexion
public enum Status {
PRELIMINARY() {
@Override
boolean process() {
return true;
}
SUBMITTED() {
@Override
boolean process() {
return false;
}
abstract boolean process();
}
J'ai un modèle comme
public class Foo {
private Status status;
public void setStatus(Status status) {
this.status = status;
}
}
je dois utiliser la réflexion pour définir un Foo.status
comme:
private static <T> void setFieldValue(Foo instance, Class<?> klazz, Object value) {
try {
Class<?> aClass = value.getClass(); // Is Status$1 instead of Status
Method method = klazz.getDeclaredMethod(getSetterName('setStatus'), aClass);
method.invoke(instance, value);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
if (!klazz.equals(Object.class)) {
setFieldValue(instance, klazz.getSuperclass(), fieldName, value);
}
}
}
Cela fonctionne lorsque Status
ne contient pas une classe interne et est enum simple, cependant pour la classe Status
ci-dessus, il va jeter un NoSuchMethodException
. C'est parce que la classe de ma valeur sera package.Status$1
au lieu de package.Status
.
Y a-t-il un bon travail pour cela?
Pour ne pas être trop pointilleux, mais votre code d'exemple manque des parenthèses et votre exemple de réflexion semble complètement non pertinent car il n'y a aucune méthode qui pourrait correspondre à l'invocation. – Dave
Merci Dave, j'ai mis à jour mon code pour mieux refléter mon problème. – pez
[Cette réponse] (https://stackoverflow.com/a/45590933/2891664) pourrait vous aider. Cependant, je me demande pourquoi exactement vous utilisez la réflexion ici, puisque vous semblez en savoir beaucoup sur la méthode que vous invoquez à l'avance. – Radiodef