[JAVA] Was ich versucht habe, als ich alle Felder einer Bohne bekommen wollte

Erinnern Sie sich an den Prozess des Versuchs und Irrtums, um alle Felder in der Bean abzurufen.

Was du machen willst

Ich möchte mit Iterator alle Felder in der Bean erhalten. ** "Feld1, Feld2, Feld3, Feld4" ** kann für die folgenden Beans erworben werden.

Fields.java


public class Fields {
  
  //Feld
  private String Field1;
  private String Field2;
  private String Field3;
  private String Field4;
  //Konstrukteur
  Fields(String Field1, String Field2, String Field3, String Field4) {
    this.Field1 = Field1;
    this.Field2 = Field2;
    this.Field3 = Field3;
    this.Field4 = Field4;
  }
  // settet,Getter weggelassen
  // .
  // .
  // .
}

Was ich versucht habe 1

Erhalten mit der ** PropertyUtils / BeanUtils-Klasse ** von ** "Apache Commons" **, einer externen Java-Bibliothek

** PropertyUtils ** und ** BeanUtils ** sind Klassen, die ** JavaBeans ** verarbeiten. [^ 1] Unter anderem mit der Methode "description (Object Bean)", mit der jeder Wert in der Bean in "Map" konvertiert und zurückgegeben wird, ** Bean in Map konvertieren → Den Schlüsselwert der konvertierten Map (Feldname) abrufen ** Ich beschloss, alle Felder in die Bohne zu bekommen.

[^ 1]: Klicken Sie hier, um eine Referenzseite zur Verwendung von BeanUtils zu erhalten. Java BeanUtils Memo (Hishidamas Commons-BeanUtils Memo)

Methode

Fields.java(Verwenden Sie PropertyUtils)


 // PropertyUtils#Holen Sie sich alle Felder mit beschreiben
 public Iterator<?> getNames() 
		  throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
    try{
        //Bean in Map konvertieren → Schlüsselwert der konvertierten Map abrufen (Feldname)
        return PropertyUtils.describe(this).keySet().iterator();
    }catch(IllegalAccessException e){
    	throw e;
    }catch(InvocationTargetException e){
    	throw e;
    }catch(NoSuchMethodException e){
    	throw e;
    }
  }

Fields.java(Verwenden Sie BeanUtils)


  // BeanUtilsUtils#Holen Sie sich alle Felder mit beschreiben
  public Iterator<?> getNames1() 
		  throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
	    try{
            //Bean in Map konvertieren → Schlüsselwert der konvertierten Map abrufen (Feldname)
	        return BeanUtils.describe(this).keySet().iterator();
	    }catch(IllegalAccessException e){
	    	throw e;
	    }catch(InvocationTargetException e){
	    	throw e;
	    }catch(NoSuchMethodException e){
	    	throw e;
	    }
	  }

Ausführungsklasse

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("Feld 1","Feld 2","Feld 3","Feld 4");
    Iterator<?> propertyUtils;
    Iterator<?> beanUtils;
	try {
		// PropertyUtils#Holen Sie sich alle Felder mit beschreiben
		propertyUtils = field.getNames();
		// BeanUtilsUtils#Holen Sie sich alle Felder mit beschreiben
		beanUtils = field.getNames1();
		System.out.println("--Verwenden Sie PropertyUtils--");
	    while(propertyUtils.hasNext()){
	        System.out.println(propertyUtils.next());
	    }
		System.out.println("--BeanUtils verwenden--");
	    while(beanUtils.hasNext()){
	        System.out.println(beanUtils.next());
	    }
	} catch (IllegalAccessException e) {
		e.printStackTrace();
	} catch (InvocationTargetException e) {
		e.printStackTrace();
	} catch (NoSuchMethodException e) {
		e.printStackTrace();
    }
  }
}

Ausführungsergebnis

Ausführungsergebnis


--Verwenden Sie PropertyUtils--
Field1
Field3
class
Field2
Field4
--BeanUtils verwenden--
Field1
Field3
class
Field2
Field4

Ich konnte den Feldnamen der Bohne erhalten, Es scheint Raum für Verbesserungen zu geben, z. B. eine "Klasse" zu erhalten, die kein Feldname ist, oder die Reihenfolge ist nicht in aufsteigender Reihenfolge.

Auch beim mehrmaligen Ausführen ... Ich habe eine InvocationTargetException bei PropertyUtils / BeanUtils.describe (this) erhalten und konnte das Feld nicht abrufen. Ich kenne die genaue Ursache nicht und habe mich daher entschlossen, den Feldnamen auf andere Weise zu ermitteln.

Ausführungsergebnis(Teil)


Caused by: java.lang.reflect.InvocationTargetException
	... 1024 more
Caused by: java.lang.StackOverflowError

Was ich versucht habe 2

Verwenden Sie Reflexion

Bean-Felder können auch ** mit der Reflection-API ** abgerufen werden. [^ 2] Mit getDeclaredFields () können ** Felder mit allen Zugriffsmodifikatoren (öffentlich, geschützt, Standard, privat) in einem Array von Feldklassen ** abgerufen werden.

[^ 2]: Feld mit Java Reflection API abrufen

Methode

Fields.java(Verwenden Sie Reflexion)


  // Class#Holen Sie sich alle Felder mit getDeclaredFields
  public Iterator<?> getNames2(){
        //Felder für alle Zugriffsmodifikatoren abrufen
    	Field[] tmpField = this.getClass().getDeclaredFields();
        //Generieren Sie eine Liste, die mit Iterator zurückgegeben werden soll
    	List<String> Field = new ArrayList<String>();
    	for(int i = 0; i < tmpField.length; i++) {
            // getName()Holen Sie sich das Feld mit
    		Field.add(tmpField[i].getName());
    	}
    	return Field.iterator();
    }

Ausführungsklasse

FieldGet.java


package test;

import java.util.Iterator;

public class FieldGet {
  public static void main (String args[]){

    Fields field = new Fields("Feld 1","Feld 2","Feld 3","Feld 4");
    terator<?> reflection;
    // Class#Holen Sie sich alle Felder mit getDeclaredFields
    reflection = field.getNames2();
    System.out.println("--Verwenden Sie Reflexion--");
    while(propertyUtils.hasNext()){
        System.out.println(propertyUtils.next());
    }
  }
}

Ausführungsergebnis

Ausführungsergebnis


--Verwenden Sie Reflexion--
Field1
Field2
Field3
Field4

Jetzt konnten wir wie erwartet alle Felder bekommen.

Sonderedition

Holen Sie sich alle Felder mit Struts DynaActionForm

Sie können auch alle Felder in Struts 'DynaActionForm abrufen. ** ✳︎ Die Idee ist die gleiche wie "Was ich versucht habe 1" **

Schritt 1: Erstellen Sie eine Klasse, die DynaValidatorForm oder DynaActionForm erbt Schritt 2: Implementieren Sie die Methode mit der gleichen Idee wie "Was ich versucht habe 1" ** (Formular in Karte konvertieren → Schlüsselwert der konvertierten Karte abrufen (Feldname)) **   Die DynaActionForm von Struts verfügt über eine getMap () -Methode, die die in der DynaActionForm definierte Eigenschaft in einen Map-Typ konvertiert und zurückgibt **. Wenn Sie diese Methode verwenden, entspricht sie der von "What I saw 1". Es ist möglich, alle Felder mit der Idee von zu bekommen. Entspricht es der Beschreibung (Object Bean) -Methode der PropertyUtils / BeanUtils-Klasse **? Ich bin mir nicht sicher über die detaillierte interne Verarbeitung ...

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

Was ich versucht habe, als ich alle Felder einer Bohne bekommen wollte
Ich habe es geschafft, ein Leerzeichen zu bekommen, als ich den Inhalt von Beans in den Textbereich gebracht habe
Immerhin wollte ich den Inhalt von MySQL mit Docker in der Vorschau anzeigen ...
Ich möchte rekursiv die Oberklasse und die Schnittstelle einer bestimmten Klasse erhalten
Wir stellen vor, was ich gemacht habe, als ich RecyclerView eine Kopf- und Fußzeile hinzufügen wollte
Ich habe versucht, was ich mit Stream leise versuchen wollte.
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Wovon ich bei der Einführung der JNI-Bibliothek süchtig war
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich habe JAX-RS ausprobiert und mir das Verfahren notiert
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
Ich habe versucht, eine Umgebung mit WSL2 + Docker + VSCode zu erstellen
Ich habe einen RESAS-API-Client in Java erstellt
[jsoup] So erhalten Sie die gesamte Dokumentation
Als ich zu IntelliJ wechselte, gab es einen großen Unterschied in der Codierung der Eigenschaftendatei.
Ich habe versucht, die Beispielanwendung gemäß der Idee des Buches "Micro Service Architecture" in einen Mikrodienst zu verwandeln.
Ich möchte eine Liste des Inhalts einer Zip-Datei und ihrer unkomprimierten Größe erhalten
Ich habe versucht, die Methode zu erklären
Ich habe versucht zusammenzufassen, was bei der Site-Java-Ausgabe gefragt wurde.
Ich habe versucht, den Weihnachtsbaum in einem Lebensspiel zu beleuchten
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Ich erhalte einen Ruby-Versionsfehler, wenn ich versuche, Rails zu starten.
Ich habe versucht, die Fehlermeldung beim Ausführen von Eclipse (Java) zu übersetzen.
Ich habe ein Juwel gemacht, um den Text des Org-Modus in Qiita zu posten
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe ein Tool erstellt, um den Unterschied zwischen CSV-Dateien auszugeben
Ich habe versucht, das Problem des Google Tech Dev Guide zu lösen
Ich habe versucht, die Ergebnisse vor und nach der Date-Klasse mit einer geraden Zahl auszudrücken
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
Ein Memo, wenn Sie den Zeitteil des Kalenders löschen möchten
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Memorandum: Wovon ich süchtig war, als ich auf die Accounting Freee API traf
Eine Geschichte, der ich beim Testen der API mit MockMVC verfallen war
Eine Geschichte, die ich mit der Stream-API von Java8 einem Prozess schreiben wollte, der einer while-Anweisung entspricht
Ich habe versucht, mit Web Assembly zu beginnen
Was tun, wenn eine javax.el.PropertyNotWritableException auftritt?
Ich möchte die JSP des offenen Portlets bei der Entwicklung von Liferay kennen
Ich habe versucht, die wichtigsten Punkte des gRPC-Designs und der Entwicklung zusammenzufassen
Es war ein Leben, in dem ich den thread-sicheren assoziativen Zähler zurücksetzen wollte
Ich wollte der Methode @VisibleForTesting hinzufügen
Ich habe versucht, das Iterator-Muster zu implementieren
[Java] Wie man mit der String-Klasse an die Spitze eines bestimmten Strings kommt
Ich habe versucht, die Stream-API zusammenzufassen
Ich möchte die IP-Adresse erhalten, wenn ich mit Java eine Verbindung zu Wi-Fi herstelle
Ich habe versucht, den CPU-Kern mit Ruby voll auszunutzen
Ich habe versucht, den Zugriff von Lambda → Athena mit AWS X-Ray zu visualisieren
So ermitteln Sie den absoluten Pfad eines in Java ausgeführten Verzeichnisses
Was ist Docker? Ich habe versucht zusammenzufassen
Ich möchte den Feldnamen des [Java] -Felds erhalten. (Alter Ton)
Ich habe versucht, die Geschwindigkeit von Graal VM mit JMH zu messen und zu vergleichen