Gardez un rappel du processus d'essais et d'erreurs pour obtenir tous les champs du bean.
Je veux obtenir tous les champs du bean avec Iterator. ** "Field1, Field2, Field3, Field4" ** peut être acquis pour les beans suivants.
Fields.java
public class Fields {
//champ
private String Field1;
private String Field2;
private String Field3;
private String Field4;
//constructeur
Fields(String Field1, String Field2, String Field3, String Field4) {
this.Field1 = Field1;
this.Field2 = Field2;
this.Field3 = Field3;
this.Field4 = Field4;
}
// settet,getter omis
// .
// .
// .
}
** PropertyUtils ** et ** BeanUtils ** sont des classes qui gèrent les ** JavaBeans **. [^ 1]
Parmi eux, en utilisant la méthode describe (Object bean)
qui convertit chaque valeur du bean en Map et la renvoie,
** Convertir Bean en Map → Obtenir la valeur clé de la Map convertie (nom du champ) **
J'ai décidé de mettre tous les champs dans le haricot.
[^ 1]: Cliquez ici pour consulter un site de référence sur l'utilisation de BeanUtils. Java BeanUtils Memo (Hishidama's commons-BeanUtils Memo)
Fields.java(Utiliser PropertyUtils)
// PropertyUtils#Obtenez tous les champs à l'aide de describe
public Iterator<?> getNames()
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
try{
//Convertir Bean en Map → Obtenir la valeur clé de la Map convertie (nom du champ)
return PropertyUtils.describe(this).keySet().iterator();
}catch(IllegalAccessException e){
throw e;
}catch(InvocationTargetException e){
throw e;
}catch(NoSuchMethodException e){
throw e;
}
}
Fields.java(Utilisez BeanUtils)
// BeanUtilsUtils#Obtenez tous les champs à l'aide de describe
public Iterator<?> getNames1()
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
try{
//Convertir Bean en Map → Obtenir la valeur clé de la Map convertie (nom du champ)
return BeanUtils.describe(this).keySet().iterator();
}catch(IllegalAccessException e){
throw e;
}catch(InvocationTargetException e){
throw e;
}catch(NoSuchMethodException e){
throw e;
}
}
FieldGet.java
package test;
import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
public class FieldGet {
public static void main (String args[]){
Fields field = new Fields("Champ 1","Champ 2","Champ 3","Champ 4");
Iterator<?> propertyUtils;
Iterator<?> beanUtils;
try {
// PropertyUtils#Obtenez tous les champs à l'aide de describe
propertyUtils = field.getNames();
// BeanUtilsUtils#Obtenez tous les champs à l'aide de describe
beanUtils = field.getNames1();
System.out.println("--Utiliser PropertyUtils--");
while(propertyUtils.hasNext()){
System.out.println(propertyUtils.next());
}
System.out.println("--Utilisation de BeanUtils--");
while(beanUtils.hasNext()){
System.out.println(beanUtils.next());
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
Résultat d'exécution
--Utiliser PropertyUtils--
Field1
Field3
class
Field2
Field4
--Utilisation de BeanUtils--
Field1
Field3
class
Field2
Field4
J'ai pu obtenir le nom de champ du haricot, Il semble y avoir place à l'amélioration, comme obtenir une «classe» qui n'est pas un nom de champ, ou l'ordre n'est pas dans l'ordre croissant.
Aussi, en l'exécutant plusieurs fois ...
ʻInvocationTargetException s'est produite à
PropertyUtils / BeanUtils.describe (this) `, et le champ n'a pas pu être récupéré.
Je ne connais pas la cause exacte, j'ai donc décidé d'envisager d'obtenir le nom du champ d'une autre manière.
Résultat d'exécution(partie)
Caused by: java.lang.reflect.InvocationTargetException
... 1024 more
Caused by: java.lang.StackOverflowError
Les champs Bean peuvent également être obtenus ** avec l'API de réflexion **. [^ 2]
Avec getDeclaredFields ()
, ** les champs avec tous les modificateurs d'accès (public, protégé, par défaut, privé) peuvent être récupérés dans un tableau de classes Field **.
[^ 2]: Obtenir le champ avec l'API de réflexion Java
Fields.java(Utilisez la réflexion)
// Class#Obtenez tous les champs à l'aide de getDeclaredFields
public Iterator<?> getNames2(){
//Obtenir des champs pour tous les modificateurs d'accès
Field[] tmpField = this.getClass().getDeclaredFields();
//Générer une liste à renvoyer avec Iterator
List<String> Field = new ArrayList<String>();
for(int i = 0; i < tmpField.length; i++) {
// getName()Obtenez le terrain avec
Field.add(tmpField[i].getName());
}
return Field.iterator();
}
FieldGet.java
package test;
import java.util.Iterator;
public class FieldGet {
public static void main (String args[]){
Fields field = new Fields("Champ 1","Champ 2","Champ 3","Champ 4");
terator<?> reflection;
// Class#Obtenez tous les champs à l'aide de getDeclaredFields
reflection = field.getNames2();
System.out.println("--Utilisez la réflexion--");
while(propertyUtils.hasNext()){
System.out.println(propertyUtils.next());
}
}
}
Résultat d'exécution
--Utilisez la réflexion--
Field1
Field2
Field3
Field4
Maintenant, comme prévu, nous avons pu obtenir tous les champs.
Vous pouvez également obtenir tous les champs dans DynaActionForm de Struts. ** ✳︎ L'idée est la même que "Ce que j'ai essayé 1" **
Étape 1: Créez une classe qui hérite de DynaValidatorForm ou DynaActionForm
Étape 2: Implémentez la méthode avec la même idée que "Ce que j'ai essayé 1" ** (Convertir le formulaire en carte → Obtenir la valeur clé de la carte convertie (nom du champ)) **
DynaActionForm de Struts a une méthode getMap ()
qui convertit la propriété définie dans DynaActionForm en un type Map et la renvoie **, donc si vous utilisez cette méthode, ce sera la même chose que "What I saw 1". Il est possible d'obtenir tous les champs avec l'idée de.
Est-ce quelque chose comme ** équivalent à la méthode describe (Object bean) de la classe PropertyUtils / BeanUtils **?
Je ne suis pas sûr du traitement interne détaillé ...
StrutsDynaValidatorForm.java
package test;
import java.util.Iterator;
import org.apache.struts.validator.DynaValidatorForm;
public class StrutsDynaValidatorForm extends DynaValidatorForm {
public Iterator getNames() {
return this.getMap().keySet().iterator();
}
}
Recommended Posts