Disons que j'ai une classe avec un champ de chaîne nommé "myfield" et utilisez la réflexion pour obtenir le champ, j'ai trouvé que Y a-t-il un moyen de contourner? le forçant à ignorer l'affaire? p>
merci p> objet.getclass (). GetDecLaredfield ("myfield"); Code > est sensible à la casse, il lancera un
NosuchfieldException code> si je par exemple utiliser
objet.getclass (). getDeclaredfield ("myfield"); Code> P>
7 Réponses :
Il suffit d'utiliser class.gedeclaredfields ( ) code>
et examinez les résultats effectuant une correspondance insensible à une casse-insensibilité. p>
La seule façon dont je vois est d'itérer sur tous les champs déclarés et de comparer les noms insensitativement sur le nom de champ que vous recherchez. P>
Obtenez une liste de tous les champs déclarés et passez-les manuellement dans une boucle faire une comparaison insensible à la casse sur le nom. P>
Non, il n'y a pas de ce type. Vous pouvez obtenir tous les champs et rechercher à travers eux:
Field[] fields = src.getClass().getDeclaredFields(); for(Field f:fields){ if(f.getName().equalsIgnoreCase("myfield")){ //stuff. } }
Non, il n'y a pas de manière directe de cela, mais vous pouvez créer une méthode d'assistance pour le faire. par exemple. (UNTEST)
public Field getDeclaredFieldIngoreCase( Class<?> clazz, String fieldName ) throws NoSuchFieldException { for( Field field : clazz.getDeclaredFields() ) { if ( field.getName().equalsIgnoreCase( fieldName ) ) { return field; } } throw new NoSuchFieldException( fieldName ); }
Je ne veux pas dire Necro ce fil, mais si vous avez utilisé l'une des méthodes ci-dessus à l'intérieur d'une boucle, votre performance sera affreuse. Créer une carte avant
Prenez d'abord l'article de votre recherche à majuscules p> Créez maintenant une carte qui a la version majuscule et les noms de terrain vrais P> Field field = clazz.getDeclaredField(fieldNames.get(key));
Si vous voulez seulement accéder à un champ pour une performance de classe particulière, il sera pire et il pourrait y avoir d'autres situations.
meilleur pour essayer de gérer le champ avec nom de terrain si n'existe pas, puis bouclez dans la liste des champs
Méfiez-vous que Java elle-même est sensible à la casse, donc il peut y avoir 2 domaines différents qui ont le même nom quand vous le faites .tolowercase () sur le nom!
Je suis au courant de cela, mais dans mon cas, il est garanti de ne pas arriver