La comparaison des valeurs de champ à l'aide de la réflexion
Je suis en train de comparer les valeurs de champ de deux objets différents de manière générique. J'ai une fonction (voir ci-dessous) qui prend deux Objets, puis il reçoit les champs et les compare ensuite les champs dans une boucle et ajoute les champs de la liste s'ils ne sont pas les mêmes - est-ce la bonne façon de le faire?
public void compareFields(Object qa, Object qa4) throws FieldsNotEqualException
{
Field[] qaFields = qa.getClass().getFields();
Field[] qa4Fields = qa4.getClass().getFields();
for(Field f:qaFields)
{
for(Field f4:qa4Fields)
{
if(f4.equals(f))
{
found = true;
break;
}
else
{
continue;
}
}
}
if(!found)
{
report.add(/*some_formatted_string*/) //some global list
throw new FieldsNotEqualException();
}
}
J'ai été sur google et j'ai vu que le C# comme un PropertyInfo de la Classe Java ont quelque chose comme ça?
AUSSI, est-il un moyen de faire comme f.getFieldValue()
-je sais il n'y a pas de méthode comme ça, mais peut-être il ya une autre façon???
Les champs appartiennent à des classes, les valeurs sont détenues (si ce n'est statique) dans les instances. Qu'est-ce exactement que vous essayez d'accomplir?
Ok, j'aurais dû être plus clair - im passage dans les deux cas de deux objets - im essayant de comparer les deux séries de données (listes d'objets) qui sont retournés par hibernate - mais je suis passer dans une boucle d'une instance de l'objet de peu de classe à un temps de comparer les champs de cette instance à l'encontre de certains autres exemple
Si vous êtes en utilisant Hibernate, cette approche pourrait ne pas fonctionner - Hibernate modifie l'objet contenu au moment de l'exécution, et je ne suis pas sûr que la réflexion va au travail, il pourrait, mais si vous avez l'expérience de quelque chose de drôle, il pourrait être Hibernate interférer avec les propriétés de l'objet.
Je pense qu'à ce point de Hibernate est fait interférer avec ces objets...j'ai l'exécution d'une requête et obtenir ensuite une Liste<Object>() de retour de mise en veille prolongée. Si je voulais le faire dans un non générique de la façon dont je pourrais chacune des instances dans la liste, puis de comparer les valeurs - mais ça fait beaucoup de code qui pourrait être fait d'une manière générique.
Si vous utilisez l'Ide, vous pouvez générer equals() et hashCode() automatiquement. J'ai tendance à aimer ces plus de l'aide de la réflexion pour comparer les données, comme avec la réflexion, vous ne pouvez pas limiter les champs qui seront comparés.
Ok, j'aurais dû être plus clair - im passage dans les deux cas de deux objets - im essayant de comparer les deux séries de données (listes d'objets) qui sont retournés par hibernate - mais je suis passer dans une boucle d'une instance de l'objet de peu de classe à un temps de comparer les champs de cette instance à l'encontre de certains autres exemple
Si vous êtes en utilisant Hibernate, cette approche pourrait ne pas fonctionner - Hibernate modifie l'objet contenu au moment de l'exécution, et je ne suis pas sûr que la réflexion va au travail, il pourrait, mais si vous avez l'expérience de quelque chose de drôle, il pourrait être Hibernate interférer avec les propriétés de l'objet.
Je pense qu'à ce point de Hibernate est fait interférer avec ces objets...j'ai l'exécution d'une requête et obtenir ensuite une Liste<Object>() de retour de mise en veille prolongée. Si je voulais le faire dans un non générique de la façon dont je pourrais chacune des instances dans la liste, puis de comparer les valeurs - mais ça fait beaucoup de code qui pourrait être fait d'une manière générique.
Si vous utilisez l'Ide, vous pouvez générer equals() et hashCode() automatiquement. J'ai tendance à aimer ces plus de l'aide de la réflexion pour comparer les données, comme avec la réflexion, vous ne pouvez pas limiter les champs qui seront comparés.
OriginalL'auteur JonH | 2012-11-21
Vous devez vous connecter pour publier un commentaire.
Vous pouvez vérifier org.apache.commons.lang.générateur de rapports.EqualsBuilder qui permettra d'économiser que vous beaucoup de ce problème si vous êtes désireux de faire un champ par champ de comparaison.
Si vous êtes désireux de comparer les champs vous-même, découvrez
java.lang.Class.getDeclaredFields()
qui vous donnera tous les domaines, y compris la non-public des champs.De comparer la valeur des champs de l'utilisation
f.get(qa).equals(f.get(qa4))
Actuellement, vous êtes en fait en comparant le champ des instances et non les valeurs.J'ai mis à jour ma réponse un peu. Le point principal est que vous devriez vraiment envisager une bibliothèque commune pour faire cette comparaison. Espérons que cette aide.
qa et qa4 est l'ensemble de l'objet??? Qui va travailler - je vais essayer...
Ok - je crois que c'est de travailler, mais j'ai une question rapide, o
f.get(qa)
obtiendrez champ "some_name"valeur - alors je n'ai pas à vous soucier de l'ordre des champs ou de faire en sorte qu'il est de comparer le même champ à droite?En supposant que ce sont le même type de classe, l'ordre sera le même.
OriginalL'auteur tjg184
Bibliothèques comme communes-beanutils peut vous aider si vous voulez comparer les propriétés du bean (valeurs retournées par les méthodes de lecture) au lieu de comparer les valeurs de champ.
Toutefois, si vous voulez coller avec de la plaine de réflexion, vous devez:
Class.getDeclaredFields()
au lieu deClass.getFields()
, que ce dernier retourne uniquement les champs publics.getDeclaredFields()
pour chaque comparaison.o
), afin d'obtenir la valeur d'un champf
pour cet objet particulier, vous devez appeler:f.get(o)
.OriginalL'auteur Costi Ciudatu
//Si vous voulez avoir des champs, pas de tout terrain, puis de les utiliser.
OriginalL'auteur Ahmed Ali