[JAVA] Ce que j'ai essayé quand je voulais obtenir tous les champs d'un haricot

Gardez un rappel du processus d'essais et d'erreurs pour obtenir tous les champs du bean.

Chose que tu veux faire

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

Ce que j'ai essayé 1

Obtenu en utilisant la ** PropertyUtils / BeanUtils class ** de ** "Apache Commons" **, qui est une bibliothèque externe de Java

** 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)

Méthode

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

Classe d'exécution

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

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

Ce que j'ai essayé 2

Utilisez la réflexion

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

Méthode

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

Classe d'exécution

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

Résultat d'exécution


--Utilisez la réflexion--
Field1
Field2
Field3
Field4

Maintenant, comme prévu, nous avons pu obtenir tous les champs.

Édition supplémentaire

Obtenez tous les champs avec Struts DynaActionForm

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

Ce que j'ai essayé quand je voulais obtenir tous les champs d'un haricot
J'ai réussi à obtenir un blanc lorsque j'ai apporté le contenu de Beans dans la zone de texte
Après tout, je voulais prévisualiser le contenu de mysql avec Docker ...
Je veux obtenir récursivement la superclasse et l'interface d'une certaine classe
Présentation de ce que j'ai fait lorsque je voulais ajouter un en-tête et un pied de page à RecyclerView
J'ai essayé ce que je voulais essayer avec Stream doucement.
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
Ce à quoi j'étais accro lors de l'introduction de la bibliothèque JNI
J'ai essayé de résumer les bases de kotlin et java
J'ai essayé JAX-RS et pris note de la procédure
J'ai brièvement résumé la grammaire de base de Ruby
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode
J'ai créé un client RESAS-API en Java
[jsoup] Comment obtenir la totalité de la documentation
Lorsque je suis passé à IntelliJ, il y avait une grande différence dans l'encodage du fichier de propriétés.
J'ai essayé de convertir l'exemple d'application en microservice selon l'idée du livre "Microservice Architecture".
Je veux obtenir une liste du contenu d'un fichier zip et sa taille non compressée
J'ai essayé d'expliquer la méthode
L'histoire que je voulais développer Zip
J'ai essayé de résumer ce qui était demandé lors de l'édition site-java-
J'ai essayé d'illuminer le sapin de Noël dans un jeu de la vie
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
J'obtiens une erreur de version de Ruby lorsque j'essaye de démarrer Rails.
J'ai essayé de traduire le message d'erreur lors de l'exécution d'Eclipse (Java)
J'ai fait un petit bijou pour poster le texte du mode org sur qiita
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
J'ai essayé de résumer les méthodes de Java String et StringBuilder
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai créé un outil pour afficher la différence du fichier CSV
J'ai essayé de résoudre le problème de Google Tech Dev Guide
J'ai essayé d'exprimer les résultats avant et après de la classe Date avec une ligne droite numérique
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
Un mémo lorsque vous souhaitez effacer la partie horaire de l'agenda
J'ai essayé de résumer les méthodes utilisées
Mémorandum: Ce à quoi j'étais accro quand j'ai frappé l'API de comptabilité freee
Une histoire à laquelle j'étais accro lors du test de l'API à l'aide de MockMVC
Je voulais écrire un processus équivalent à une instruction while avec l'API Java 8 Stream
J'ai essayé de démarrer avec Web Assembly
Que faire lorsqu'une exception javax.el.PropertyNotWritableException se produit
Je veux connaître le JSP du portlet ouvert lors du développement de Liferay
J'ai essayé de résumer les points clés de la conception et du développement de gRPC
C'était une vie que je voulais réinitialiser le compteur associatif thread-safe
Je voulais ajouter @VisibleForTesting à la méthode
J'ai essayé d'implémenter le modèle Iterator
[Java] Comment accéder au début d'une chaîne spécifique à l'aide de la classe String
J'ai essayé de résumer l'API Stream
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
J'ai essayé de visualiser l'accès de Lambda → Athena avec AWS X-Ray
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
Qu'est-ce que Docker? J'ai essayé de résumer
Je veux obtenir le nom de champ du champ [Java]. (Vieux ton d'histoire)
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH