Erinnern Sie sich an den Prozess des Versuchs und Irrtums, um alle Felder in der Bean abzurufen.
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
// .
// .
// .
}
** 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)
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;
}
}
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
--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
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
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();
}
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
--Verwenden Sie Reflexion--
Field1
Field2
Field3
Field4
Jetzt konnten wir wie erwartet alle Felder bekommen.
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