java.lang.NoSuchFieldException: lors de l'utilisation de la réflexion
public static <A, B> B convert(A instance,
Class<B> targetClass) throws Exception {
B target = (B)targetClass.newInstance();
for (Field targetField : targetClass.getDeclaredFields()) {
targetField.setAccessible(true);
Field field =
instance.getClass().getDeclaredField(targetField.getName());
field.setAccessible(true);
targetField.set(target, field.get(instance));
}
return target;
}
Ci-dessus est le code que j'obtiens de forum, Quand j'essaye de réfléchir un seul type d'objet, il fonctionne, mais quand je l'ai essayer sur le type complexe ce qui signifie à l'intérieur de ClassA
j'ai eu ClassB
objet, j'ai eu l' java.lang.NoSuchFieldException
. Quelqu'un peut-il m'aider?
par ailleurs, la politique générale de l'aide de Stackoverflow est pour marquer une réponse comme "accepté" (la tique au-dessous de la voix à chaque réponse) chaque fois qu'il vous convient.
Où est la trace de la pile, par le chemin?
Bonne suggestion à l'avance 😉
d'accord si il y a bien entendu accepté
C'est parce que pas de réponse est exactement ce que je veux
Où est la trace de la pile, par le chemin?
Bonne suggestion à l'avance 😉
d'accord si il y a bien entendu accepté
C'est parce que pas de réponse est exactement ce que je veux
OriginalL'auteur user236501 | 2010-01-08
Vous devez vous connecter pour publier un commentaire.
Vous avez deux classes différentes, avec, le plus souvent, les différents champs.
Donc, si votre Classe
A
n'ont pas les mêmes champs que votre classeB
, alors, l'exception est levée.Je suggérerais à l'aide de
BeanUtils.copyProperties(source, cible)
de apache commons-beanutils. Vous venez de créer le deuxième objet vous-même, et de le passer à la méthode. Il ne sera pas lever une exception si les champs diffèrent.Quel est votre but ultime avec ce morceau de code?
OriginalL'auteur Bozho
Deux suggestion:
(1) Vous pouvez déposer les humbles à la première ligne de la méthode:
(2) Ajouter un try catch, de sorte que vous pouvez voir le nom du champ manquant. Cela vous aidera à trier le problème que vous rencontrez:
OriginalL'auteur Itay Maman
Une autre réponse.
Si je comprends bien votre commentaire correctement, il semble que vous avez inner classes: Classe B (Cible) est une classe qui est définie à l'intérieur de la classe A. quelque Chose comme ceci:
Bien que ces deux catégories semblent avoir les mêmes domaines et, par conséquent, ne doit pas inude un champ ne trouve pas d'erreur - qu'ils ne le sont pas.
Les classes internes (sauf s'ils sont définis comme statique) a un champ caché, inséré par le compilateur. Ce champ est le type de l'extérieur de la classe et les points de l'objet qui a créé l'intérieur de la classe de l'objet. Lors de l'utilisation de la réflexion, ce terrain est exposé. Comme ne pas avoir un tel champ, une exception est levée.
OriginalL'auteur Itay Maman