7
votes

Réflexion Java, ignorer le cas lors de l'utilisation de getDeclaredfield

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 objet.getclass (). GetDecLaredfield ("myfield"); est sensible à la casse, il lancera un NosuchfieldException si je par exemple utiliser objet.getclass (). getDeclaredfield ("myfield");

Y a-t-il un moyen de contourner? le forçant à ignorer l'affaire?

merci


2 commentaires

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


7 Réponses :


17
votes

Il suffit d'utiliser class.gedeclaredfields ( ) et examinez les résultats effectuant une correspondance insensible à une casse-insensibilité.


0 commentaires

2
votes

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.


0 commentaires

2
votes

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.


0 commentaires

3
votes

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.
    }
}


0 commentaires

2
votes

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 );
}


0 commentaires

1
votes

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> xxx pré>

Créez maintenant une carte qui a la version majuscule et les noms de terrain vrais P>

  Field field = clazz.getDeclaredField(fieldNames.get(key));


1 commentaires

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.



0
votes

meilleur pour essayer de gérer le champ avec nom de terrain si n'existe pas, puis bouclez dans la liste des champs xxx


0 commentaires