Java-Reflektion leicht gemacht
JavavonBetrachtungEinführung einer Dienstprogrammklasse, die Ihnen die einfache Verwendung der API ermöglicht.
Was ist Reflexion?
Reflection-APIZähne,"java.lang.reflect” im Paket enthalten,
Dabei handelt es sich um eine API, die Informationen wie Felder und Methoden aus Java-Klassen abruft.
Die folgenden Klassen werden hauptsächlich verwendet.
- java.lang.Class
- java.lang.reflect.Constructor
- java.lang.reflect.Method
- java.lang.reflect.Field
BetrachtungMithilfe von können Sie Klassen erstellen oder Methoden aufrufen, ohne diese direkt codieren zu müssen.
Sie können eine Klasseninstanz aus einem String erstellen oder eine Methode ausführen.
Indem Sie die Definitionen von Klassennamen und Methodennamen in externe Dateien wie XML schreiben, können Sie die Anwendung während der Laufzeit dynamisch an Änderungen in der Umgebung anpassen.
Es ist auch eine sehr effektive API zum Erstellen hochflexibler Anwendungen.
Zweck der Reflexion
Betrachtungwird nicht oft direkt von Benutzern verwendet,
Es wird häufig in Webanwendungen wie Struts und Frameworks wie O/R-Mapping verwendet.
Wenn Sie beispielsweise Web-Bildschirmeingabedaten automatisch auf JavaBeans-Eigenschaften festlegen,
Es wird bei der Ausgabe von SQL verwendet, das basierend auf JavaBeans-Eigenschaften automatisch aktualisiert wird.
Darüber hinaus stehen Funktionen wie das dynamische Laden und Registrieren von Plug-Ins zur Verfügung, die die Funktionalität beim Start der Anwendung erweitern.BetrachtungDies lässt sich ganz einfach mit erreichen.
Ausführen der Probe
Bitte führen Sie das Beispiel aus und erleben Sie die Framework-ähnliche Programmierung.
Hier verwenden wir die folgende KlasseBetrachtungDemonstriert eine einfache Verwendung des Dienstprogramms.
Main.java...Klasse, die ausgeführt werden soll
BeanUtil.java...Reflection-Dienstprogrammklasse
FreeSoft.java...Wird als Reflexion in einer Klasse verwendet, die freie Software repräsentiert.
●Bei normaler Ausführung
FreeSoft freeSoft = new FreeSoft();
freeSoft.setName(„Chat&Messenger Chat und Messenger!!“);
freeSoft.showName();
freeSoft.showPrice(0);
●Bei Ausführung mit Reflexion
//Erstelle eine Instanz der FreeSoft-Klasse
Objekt invokeObject = BeanUtil.newInstance(„FreeSoft“);
//Legen Sie den Wert im Namensfeld fest.
BeanUtil.setProperty(invokeObject, "Name" , „Chat&Messenger Chat und Messenger!!“);
// Führe die showName()-Methode von FreeSoft aus.
BeanUtil.invoke(invokeObject, "Name anzeigen", Null);
// Führe die showPrice()-Methode von FreeSoft aus.
// Wenn die Methode Argumente hat, müssen diese als Array vom Typ Object übergeben werden.
BeanUtil.invoke(invokeObject, „showPrice“,new Object[]{new Integer(0)});
●Ausführungsergebnisse
Die Ausführungsergebnisse sind im Normalfall und bei Verwendung von Reflektion gleich.
Name der Software: Chat&Messenger Chat und Messenger! !
Preis: 0 Yen
>>> Bei Verwendung von Reflexion
Name der Software: Chat&Messenger Chat und Messenger! !
Preis: 0 Yen
Details zur BeanUtil-Methode
neueInstanz
öffentliches statisches Objekt neueInstanz(String className) löst eine Ausnahme aus
- Erzeugt eine Instanz aus der Zeichenfolge „className“ und gibt sie zurück.
-
- Parameter:
Klassenname
– Vollqualifizierter Klassenname- Rückgabewert:
- Eine neue Instanz eines vollständig qualifizierten Klassennamens
- Ausnahme:
Ausnahme
neueInstanz
öffentliches statisches Objekt neueInstanz(String className, Object[] argObj) löst eine Ausnahme aus
- Erzeugt eine Instanz aus der Zeichenfolge „className“ und gibt sie zurück.
-
- Parameter:
Klassenname
– Vollqualifizierter KlassennameargObj
– Konstruktorargumente- Rückgabewert:
- Eine neue Instanz eines vollständig qualifizierten Klassennamens
- Ausnahme:
Ausnahme
neueInstanz
öffentliches statisches Objekt neueInstanz(Klasse clazz) löst eine Ausnahme aus
- Erzeugt eine Instanz der Klasse „clazz“ und gibt sie zurück.
-
- Parameter:
Clazz
- Klasse- Rückgabewert:
- Neue Instanz von Clazz
- Ausnahme:
Ausnahme
neueInstanz
öffentliches statisches Objekt neueInstanz(Klasse clazz, Object[] argObj) löst eine Ausnahme aus
- Erzeugt eine Instanz der Klasse „clazz“ und gibt sie zurück.
-
- Parameter:
Clazz
- KlasseargObj
– Konstruktorargumente- Rückgabewert:
- Neue Instanz von Clazz
- Ausnahme:
Ausnahme
setProperty
öffentliche statische Leere setProperty(Object invokeObject, String fieldName, Object value) löst eine Ausnahme aus
- Rufen Sie die Setter-Methode des Feldes „fieldName“ des Objekts „invokeObject“ auf und speichern Sie den Wert „value“.
Wenn es keine Setter-Methode gibt, wird der Wert direkt auf das Feld gesetzt. In diesem Fall muss der Zugriffsmodifikator der Zieleigenschaft jedoch öffentlich sein.
-
- Parameter:
invokeObject
– Auszuführendes ObjektFeldname
– Eigenschaftsname des auszuführenden ObjektsWert
– Wert, der eingestellt werden soll- Ausnahme:
Ausnahme
– Die folgende Ausnahme tritt auf.InvocationTargetException
– Wenn die zugrunde liegende Methode eine Ausnahme auslöstIllegalAccessException
– Dieses Methodenobjekt ist Java
Wenn die Sprachzugriffskontrolle implementiert ist und auf die zugrunde liegende Methode nicht zugegriffen werden kannNoSuchMethodException
– Wenn eine Methode mit dem angegebenen Namen nicht gefunden wird
getProperty
öffentliches statisches Objekt getProperty(Objekt invokeObject, String fieldName) löst eine Ausnahme aus
- Ruft die Getter-Methode des Felds fieldName des Objekts invokeObject auf, um den Wert abzurufen.
Wenn keine Getter-Methode vorhanden ist, wird der Wert direkt aus dem Feld abgerufen. In diesem Fall muss der Zugriffsmodifikator der Zieleigenschaft jedoch öffentlich sein. -
- Parameter:
invokeObject
– Auszuführendes ObjektFeldname
– Eigenschaftsname des auszuführenden Objekts- Rückgabewert:
- Rückgabewert der Getter-Methode
- Ausnahme:
Ausnahme
– Die folgende Ausnahme tritt auf.InvocationTargetException
– Wenn die zugrunde liegende Methode eine Ausnahme auslöstIllegalAccessException
– Dieses Methodenobjekt ist Java
Wenn die Sprachzugriffskontrolle implementiert ist und auf die zugrunde liegende Methode nicht zugegriffen werden kannNoSuchFieldException
– Wenn ein Feld mit dem angegebenen Namen nicht gefunden wird
aufrufen
öffentliches statisches Objekt aufrufen(Objekt invokeObject, String callMethod, Object[] argObjects) löst InvocationTargetException, IllegalAccessException, NoSuchMethodException aus
- Führt die Methode „callMethod“ des Objekts „invokeObject“ aus.
Wenn ein Rückgabewert vorhanden ist, kann dieser als Objekt abgerufen werden. -
- Parameter:
invokeObject
– Auszuführendes ObjektcallMethod
– Name der auszuführenden MethodeargObjects
– Wenn Argumente vorhanden sind, übergeben Sie diese als Array von Objekten. Wenn keine Argumente vorhanden sind, übergeben Sie null.- Rückgabewert:
- Rückgabewert der Ausführung von „callMethod“
- Ausnahme:
InvocationTargetException
– Wenn die zugrunde liegende Methode eine Ausnahme auslöstIllegalAccessException
– Dieses Methodenobjekt ist Java
Wenn die Sprachzugriffskontrolle implementiert ist und auf die zugrunde liegende Methode nicht zugegriffen werden kannNoSuchMethodException
– Wenn eine Methode mit dem angegebenen Namen nicht gefunden wird
findMethod
öffentliche statische Methode findMethod(Objekt invokeObject, String callMethod, Object[] argObjects) löst eine NoSuchMethodException aus
- Suchen Sie nach der Methode „callMethod“ des Objekts „invokeObject“.
-
- Parameter:
invokeObject
– Auszuführendes ObjektcallMethod
– Methodenname des auszuführenden ObjektsargObjects
– Wenn Argumente vorhanden sind, übergeben Sie diese als Array von Objekten. Wenn keine Argumente vorhanden sind, übergeben Sie null.- Rückgabewert:
- Ein Methodenobjekt, das den angegebenen Argumentbedingungen entspricht
- Ausnahme:
NoSuchMethodException
– Wenn keine passende Methode gefunden wird oder der Name „“ oder „“ lautet
setField
öffentliche statische Leere setField(Object invokeObject, String fieldName, Object value) löst IllegalAccessException, NoSuchFieldException aus
- Speichert den Wert „value“ im Feldnamen „fieldName“ des auszuführenden Objekts „invokeObject“.
-
- Parameter:
invokeObject
– Auszuführendes ObjektFeldname
– Feldname des auszuführenden ObjektsWert
– Wert, der eingestellt werden soll- Ausnahme:
IllegalAccessException
– Das Feld, auf dem das angegebene Objekt basiert (oder seine Unterklasse oder sein Implementierer)
keine Instanz der Klasse oder Schnittstelle ist, die sie deklariert, oder wenn die Entpackungskonvertierung fehlschlägtNoSuchFieldException
– Wenn ein Feld mit dem angegebenen Namen nicht gefunden wird
getField
öffentliches statisches Objekt getField(Objekt invokeObject, String fieldName) löst IllegalAccessException, NoSuchFieldException aus
- Ruft den Wert des Feldnamens „fieldName“ des auszuführenden Objekts „invokeObject“ ab.
-
- Parameter:
invokeObject
– Auszuführendes ObjektFeldname
– Feldname des auszuführenden Objekts- Rückgabewert:
- Rückgabewert
- Ausnahme:
IllegalAccessException
– Das Feld, auf dem das angegebene Objekt basiert (oder seine Unterklasse oder sein Implementierer)
keine Instanz der Klasse oder Schnittstelle ist, die sie deklariert, oder wenn die Entpackungskonvertierung fehlschlägtNoSuchFieldException
– Wenn ein Feld mit dem angegebenen Namen nicht gefunden wird
hasField
öffentlicher statischer boolescher Wert hasField(Objektobjekt, String Feldname) löst eine Ausnahme aus
- Prüft, ob das Objekt „object“ den Feldnamen „fieldName“ deklariert.
-
- Parameter:
Objekt
– Zu prüfendes ObjektFeldname
– Zu überprüfender Feldname- Rückgabewert:
- wahr, wenn deklariert
- Ausnahme:
Ausnahme
getAllFields
öffentliches statisches java.util.TreeSet getAllFields(Objektobjekt) löst eine Ausnahme aus
-
- Parameter:
Objekt
–- Rückgabewert:
- Ausnahme:
Ausnahme
getShortClassName
öffentlicher statischer String getShortClassName(Objektobjekt)
- Ruft den unqualifizierten Klassennamen von einem Objekt ab.
-
- Parameter:
Objekt
–- Rückgabewert:
getShortClassName
öffentlicher statischer String getShortClassName(String-Klassenname)
- Ruft den Klassennamen aus dem vollständig qualifizierten Namen ab.
-
- Parameter:
Klassenname
–- Rückgabewert:
getFieldName
öffentlicher statischer String getFieldName(String methodName)
- Ändern Sie den Feldnamen vom Methodennamen. Muss den JavaBeans-Konventionen entsprechen.
-
- Parameter:
Methodenname
–- Rückgabewert:
isClassExist
öffentlicher statischer boolescher Wert isClassExist(String-Klassenname)
- Überprüft, ob der vollständig qualifizierte Name „className“ ein vorhandener Klassenname ist.
-
- Parameter:
Klassenname
–- Rückgabewert:
getPropertyDescriptors
öffentlicher statischer PropertyDescriptor[] getPropertyDescriptors(Objektobjekt) löst eine IntrospectionException aus
- Gibt einen PropertyDescriptor zurück, der Objektinformationen für „object“ enthält.
-
- Parameter:
Objekt
–- Rückgabewert:
- Ausnahme:
java.beans.IntrospectionException
BeanUtil-Quellcode
/**
* Utility-Klasse, die Ihnen die einfache Verwendung der Reflection-API von Java ermöglicht
*/
öffentliche Klasse BeanUtil {
/** */
privater statischer finaler String GET = „GET“;
/** */
privater statischer finaler String SET = „SET“;
// ———————————————————-『newInstance』
/**
* Erzeugt eine Instanz aus der Zeichenfolge „className“ und gibt sie zurück.
* @param className vollständig qualifizierter Klassenname
* @return neue Instanz des vollständig qualifizierten Klassennamens
* @throws-Ausnahme
*/
öffentliches statisches Objekt newInstance(String className) löst eine Ausnahme aus {
versuchen {
return Class.forName(className).newInstance();
} Catch (NoClassDefFoundError e) {
System.err.println(“NoClassDefFoundError: ” + className);
wirf e;
}
}
/**
* Erzeugt eine Instanz aus der Zeichenfolge „className“ und gibt sie zurück.
* @param className vollständig qualifizierter Klassenname
* @param argObj-Konstruktorargument
* @return neue Instanz des vollständig qualifizierten Klassennamens
* @throws-Ausnahme
*/
öffentliches statisches Objekt newInstance(String className, Object[] argObj)
wirft eine Ausnahme {
Class[] argClass = new Class[argObj.length];
for (int i = 0; i < argObj.length; i++) {
argClass[i] = argObj[i].getClass();
}
Konstruktor c = Class.forName(className).getConstructor(argClass);
return c.newInstance(argObj);
}
/**
* Erstellen Sie eine Instanz der Klasse „clazz“ und geben Sie sie zurück.
* @param Clazz-Klasse
* @return neue Instanz von clazz
* @throws-Ausnahme
*/
öffentliches statisches Objekt newInstance(Klasse clazz) löst eine Ausnahme aus {
return clazz.newInstance();
}
/**
* Erstellen Sie eine Instanz der Klasse „clazz“ und geben Sie sie zurück.
* @param Clazz-Klasse
* @param argObj-Konstruktorargument
* @return neue Instanz von clazz
* @throws-Ausnahme
*/
öffentliches statisches Objekt newInstance(Klasse clazz, Object[] argObj)
wirft eine Ausnahme {
Class[] argClass = new Class[argObj.length];
for (int i = 0; i < argObj.length; i++) {
argClass[i] = argObj[i].getClass();
}
Konstruktor c = clazz.getConstructor(argClass);
return c.newInstance(argObj);
}
// ---------------------"Methode"
/**
* Setter-Methode des Felds „fieldName“ des Objekts „invokeObject“
* Aufruf, Wert 'Wert' speichern.
* <br>
* Wenn es keine Setter-Methode gibt, legen Sie den Wert direkt auf das Feld fest.
* In diesem Fall muss der Zugriffsmodifikator der Zieleigenschaft jedoch öffentlich sein.
* @param invokeObject Objekt, das ausgeführt werden soll
* @param fieldName Eigenschaftsname des auszuführenden Objekts
* @param value Wert, der eingestellt werden soll
* @throws Ausnahme Die folgende Ausnahme tritt auf.
* @throws InvocationTargetException, wenn die zugrunde liegende Methode eine Ausnahme auslöst
* @throws IllegalAccessException Wenn dieses Methodenobjekt Java ist
* Wenn die Sprachzugriffskontrolle implementiert ist und auf die zugrunde liegende Methode nicht zugegriffen werden kann
* @throws NoSuchMethodException, wenn eine Methode mit dem angegebenen Namen nicht gefunden wird
*/
public static void setProperty(Object invokeObject, String fieldName,
Objektwert) löst eine Ausnahme aus {
versuchen {
Methode method = searchMethod(invokeObject, fieldName, SET);
Class[] paramClasses = method.getParameterTypes();
Object[] valueArray = null;
if (paramClasses[0].isInstance(value)) {
//Nicht konvertieren, wenn das festzulegende Objekt eine Unterklasse der Argumentklasse ist.
valueArray = neues Objekt[] { Wert };
} anders {
valueArray = neues Objekt[] { convObject(value, paramClasses[0]
.getName()) };
}
method.invoke(invokeObject, valueArray);
} Catch (NoSuchMethodException e) {
versuchen {
// Wenn keine Setter-Methode vorhanden ist, legen Sie sie direkt auf das Feld fest.
setField(invokeObject, fieldName, value);
} Catch (NoSuchFieldException fe) {
String errorMes = „\nClass“ + getShortClassName(invokeObject)
+ „ist“ + „für Feld „“ + Feldname + „“\n“
+ „Es gibt keine zugängliche Setter-Methode und.“
+ „Feld „“ + Feldname
+ „“ ist ebenfalls nicht öffentlich. ” + „“;
throw new IllegalAccessException(errorMes);
}
}
}
/**
* Getter-Methode des Feldes fieldName des Objekts invokeObject
* Holen Sie sich den Anrufwert. <br>
* Wenn keine Getter-Methode vorhanden ist, wird der Wert direkt aus dem Feld abgerufen.
* In diesem Fall muss der Zugriffsmodifikator der Zieleigenschaft jedoch öffentlich sein.
* @param invokeObject Objekt, das ausgeführt werden soll
* @param fieldName Eigenschaftsname des auszuführenden Objekts
* @return Rückgabewert der Getter-Methode
* @throws Ausnahme Die folgende Ausnahme tritt auf.
* @throws InvocationTargetException, wenn die zugrunde liegende Methode eine Ausnahme auslöst
* @throws IllegalAccessException Wenn dieses Methodenobjekt Java ist
* Wenn die Sprachzugriffskontrolle implementiert ist und auf die zugrunde liegende Methode nicht zugegriffen werden kann
* @throws NoSuchFieldException, wenn ein Feld mit dem angegebenen Namen nicht gefunden wird
*/
öffentliches statisches Objekt getProperty(Object invokeObject, String fieldName)
wirft eine Ausnahme {
versuchen {
Methode method = searchMethod(invokeObject, fieldName, GET);
return method.invoke(invokeObject, null);
} Catch (NoSuchMethodException e) {
return getField(invokeObject, fieldName);
}
}
/**
* Führt die Methode „callMethod“ des Objekts „invokeObject“ aus.
* Wenn ein Rückgabewert vorhanden ist, kann dieser als Objekttyp abgerufen werden.
* @param invokeObject Objekt, das ausgeführt werden soll
* @param callMethod Methodenname, der ausgeführt werden soll
* @param argObjects Wenn es ein Argument gibt, übergeben Sie es als Array von Objekten.
* Übergeben Sie null, wenn kein Argument vorhanden ist.
* @return Rückgabewert der Ausführung von „callMethod“
* @throws InvocationTargetException, wenn die zugrunde liegende Methode eine Ausnahme auslöst
* @throws IllegalAccessException Wenn dieses Methodenobjekt Java ist
* Wenn die Sprachzugriffskontrolle implementiert ist und auf die zugrunde liegende Methode nicht zugegriffen werden kann
* @throws NoSuchMethodException, wenn eine Methode mit dem angegebenen Namen nicht gefunden wird
*/
öffentliches statisches Objekt invoke(Object invokeObject, String callMethod,
Object[] argObjects) löst eine InvocationTargetException aus,
IllegalAccessException, NoSuchMethodException {
Methode method = findMethod(invokeObject, callMethod, argObjects);
return method.invoke(invokeObject, argObjects);
}
/**
* Suchen Sie nach der Methode „callMethod“ des Objekts „invokeObject“.
* @param invokeObject Objekt, das ausgeführt werden soll
* @param callMethod Methodenname des auszuführenden Objekts
* @param argObjects Wenn es ein Argument gibt, übergeben Sie es als Array von Objekten.
* Übergeben Sie null, wenn kein Argument vorhanden ist.
* @return Methodenobjekt, das den angegebenen Argumentbedingungen entspricht
* @throws NoSuchMethodException Wenn keine passende Methode gefunden wird,
* Oder wenn der Name „ " oder " "im Fall von
*/
öffentliche statische Methode findMethod(Object invokeObject, String callMethod,
Object[] argObjects) löst NoSuchMethodException {
Class[] paramClasses = null;
Methode[] Methoden = invokeObject.getClass().getMethods();
oben: for (int i = 0; i <methods.length; i++) {
if (methods[i].getName().equals(callMethod)) {
if (argObjects == null
&& methoden[i].getParameterTypes().length == 0) {
Rückgabemethoden[i];
}
if (argObjects == null) {
weitermachen;
}
paramClasses = methoden[i].getParameterTypes();
if (paramClasses.length == argObjects.length) {
// Alle Parameterlistentypen und Argumenttypen validieren
for (int j = 0; j < paramClasses.length; j++) {
Klasse paramClass = paramClasses[j];
Objekt argObj = argObjects[j];
// Wenn der Argumenttyp primitiv ist, das Argumentobjekt
// ist nicht null und primitiv
//Wenn es eine Unterklasse von Number ist, ist es in Ordnung.
if (argObj == null) {
weitermachen;
}
if (paramClass.isPrimitive()
&& (argObj-Instanz von Number || argObj
.getClass().isPrimitive())) {
weitermachen;
}
if (!paramClass.isInstance(argObj)) {
// Fahren Sie mit der nächsten Methode fort, wenn die Typen nicht mit der impliziten Konvertierung kompatibel sind
weiter oben;
}
}
Rückgabemethoden[i];
}
}
}
String paramLength = (paramClasses != null) ? Integer
.toString(paramClasses.length) : „“;
String errorMes = getShortClassName(invokeObject) + „method“
+ callMethod + „Es gibt keine.“ + „[ paramClasses.length ] = “
+ paramLength + „,[ argObjects.length ] = „ + argObjects.length
+ “”;
throw new NoSuchMethodException(errorMes);
}
// ----------------------"Feld"
/**
* Wert für den Feldnamen „fieldName“ des auszuführenden Objekts „invokeObject“.
* Speichert „Wert“.
* @param invokeObject Objekt, das ausgeführt werden soll
* @param fieldName Feldname des auszuführenden Objekts
* @param value Wert, der eingestellt werden soll
* @throws IllegalAccessException Wenn das angegebene Objekt ist
* Feld (oder seine Unterklasse oder sein Implementierer)
* Wenn es sich nicht um eine Instanz einer Klasse oder Schnittstelle handelt, deklarieren Sie es
* oder wenn die Entpackungskonvertierung fehlschlägt
* @throws NoSuchFieldException, wenn ein Feld mit dem angegebenen Namen nicht gefunden wird
*/
public static void setField(Object invokeObject, String fieldName,
Objektwert) wirft IllegalAccessException, NoSuchFieldException {
Feld field = searchField(invokeObject, fieldName);
String className = field.getType().getName();
Objekt convObj = null;
if (field.getType().isInstance(value)) {
convObj = Wert;
} anders {
convObj = convObject(value, className);
}
field.set(invokeObject, convObj);
}
/**
* Setzen Sie den Wert des Feldnamens „fieldName“ des Ausführungsobjekts „invokeObject“ auf
* Erhalten.
* @param invokeObject Objekt, das ausgeführt werden soll
* @param fieldName Feldname des auszuführenden Objekts
* @return Rückgabewert
* @throws IllegalAccessException Wenn das angegebene Objekt ist
* Feld (oder seine Unterklasse oder sein Implementierer)
* Wenn es sich nicht um eine Instanz einer Klasse oder Schnittstelle handelt, deklarieren Sie es
* oder wenn die Entpackungskonvertierung fehlschlägt
* @throws NoSuchFieldException, wenn ein Feld mit dem angegebenen Namen nicht gefunden wird
*/
öffentliches statisches Objekt getField(Object invokeObject, String fieldName)
wirft IllegalAccessException, NoSuchFieldException {
Feld field = searchField(invokeObject, fieldName);
return field.get(invokeObject);
}
/**
* Prüfen Sie, ob das Objekt „object“ den Feldnamen „fieldName“ deklariert
* bestätigen.
* @param object Zu untersuchendes Objekt
* @param fieldName Zu prüfender Feldname
* @return true, wenn deklariert
* @throws-Ausnahme
*/
public static boolean hasField(Object object, String fieldName)
wirft eine Ausnahme {
PropertyDescriptor[] props = getPropertyDescriptors(object);
for (int i = 0; i < props.length; i++) {
String _fieldName = props[i].getName();
if (fieldName.equals(_fieldName)) {
return true;
}
}
falsch zurückgeben;
}
/**
*
* @param-Objekt
* @zurückkehren
* @throws-Ausnahme
*/
öffentliches statisches TreeSet getAllFields(Object object) löst eine Ausnahme aus {
TreeSet fieldSet = new TreeSet();
// Eigenschaftsnamen von Methode abrufen
PropertyDescriptor[] props = getPropertyDescriptors(object);
for (int i = 0; i < props.length; i++) {
String fieldName = props[i].getName();
fieldSet.add(fieldName);
}
// Eigenschaftsnamen aus Feld abrufen
Field[] Felder = object.getClass().getFields();
for (int i = 0; i < field.length; i++) {
String fieldName = Felder[i].getName();
if (!fieldSet.contains(fieldName)) {
fieldSet.add(fieldName);
}
}
return fieldSet;
}
/**
*
* @param invokeObject Objekt, das ausgeführt werden soll
* @param fieldName Feldname des auszuführenden Objekts
* @return Abgelegte Objekte, die den angegebenen Argumentbedingungen entsprechen
* @throws NoSuchFieldException, wenn ein Feld mit dem angegebenen Namen nicht gefunden wird
*/
privates statisches Feld searchField(Object invokeObject, String fieldName)
wirft NoSuchFieldException {
versuchen {
return invokeObject.getClass().getField(fieldName);
} Catch (NoSuchFieldException e) {
// Dieser Bereich wird aus dem Namen der Tabellenspalte ermittelt
fieldName = checkFieldName(fieldName);
Field[] Felder = invokeObject.getClass().getFields();
for (int i = 0; i < field.length; i++) {
if (fields[i].getName().equalsIgnoreCase(fieldName)) {
Rückgabefelder[i];
}
}
throw new NoSuchFieldException(fieldName);
}
}
// ----------------------" Andere "
/**
* Rufen Sie den unqualifizierten Klassennamen von einem Objekt ab.
* @param-Objekt
* @zurückkehren
*/
öffentlicher statischer String getShortClassName(Object object) {
if (object == null) {
„null“ zurückgeben;
}
String name = object.getClass().getName();
return getShortClassName(name);
}
/**
* Ermitteln Sie den Klassennamen aus dem vollständig qualifizierten Namen.
* @param Klassenname
* @zurückkehren
*/
öffentlicher statischer String getShortClassName(String className) {
int index = className.lastIndexOf(“.”);
return className.substring(index + 1);
}
/**
* Ändern Sie den Feldnamen vom Methodennamen. Entspricht den JavaBeans-Konventionen
* wird gebraucht.
* @param Methodenname
* @zurückkehren
*/
öffentlicher statischer String getFieldName(String methodName) {
String fieldName = null;
if (methodName.startsWith(“is”)) {
fieldName = methodName.substring(2);
} anders {
fieldName = methodName.substring(3);
}
fieldName = convString(fieldName, 0, „L“);
return fieldName;
}
/**
* Stellen Sie sicher, dass der vollständig qualifizierte Name „className“ ein vorhandener Klassenname ist.
* @param Klassenname
* @zurückkehren
*/
öffentlicher statischer boolescher Wert isClassExist(String className) {
versuchen {
Class.forName(className);
return true;
} Catch (Ausnahme e) {
falsch zurückgeben;
}
}
private final static Map beanInfoCache = new HashMap();
/**
* Gibt einen PropertyDescriptor zurück, der Objektinformationen für „object“ enthält.
* @param-Objekt
* @zurückkehren
* @throws IntrospectionException
*/
öffentlicher statischer PropertyDescriptor[] getPropertyDescriptors(Object-Objekt)
wirft IntrospectionException {
BeanInfo beanInfo = (BeanInfo) beanInfoCache.get(object.getClass());
if (beanInfo == null) {
beanInfo = Introspector.getBeanInfo(object.getClass());
beanInfoCache.put(object.getClass(), beanInfo);
}
// BeanInfo beanInfo = Introspector.getBeanInfo(object.getClass());
return beanInfo.getPropertyDescriptors();
}
// ————————————————————————–
// ———————————————“Private Methode unten“
// ————————————————————————–
/**
* Suchen Sie nach der Zugriffsmethode für das Argument fieldName basierend auf PropertyDescriptor.
* @param invokeObject Objekt, das ausgeführt werden soll
* @param fieldName Feldname
* @param Typ Getter-Methode ⇒ GET Getter-Methode ⇒ SET
* @return Methodenobjekt, das den angegebenen Argumentbedingungen entspricht
* @throws NoSuchMethodException Wenn keine passende Methode gefunden wird,
* Oder wenn der Name „ " oder " ”
* im Fall von
* @throws IntrospectionException
*/
private statische Methode searchMethod(Object invokeObject, String fieldName,
String-Typ) wirft NoSuchMethodException, IntrospectionException {
Methode method = null;
fieldName = checkFieldName(fieldName);
PropertyDescriptor[] props = getPropertyDescriptors(invokeObject);
for (int i = 0; i < props.length; i++) {
String name = props[i].getName();
if (!name.equalsIgnoreCase(fieldName)) {
weitermachen;
}
if (type.equals(GET)) {
method = props[i].getReadMethod();
} anders {
method = props[i].getWriteMethod();
}
if (Methode == null) {
weitermachen;
}
Rückgabemethode;
}
// Wenn die Methode nicht existiert.
throw new NoSuchMethodException („Klasse hat keine Methoden.“
+ „(Groß-/Kleinschreibung wird nicht beachtet.):“ + type.toLowerCase()
+ convString(fieldName, 0, „U“) + „()“);
}
/**
* Überprüft, ob das Argument fieldName ein Spaltenname ist; wenn es ein Spaltenname ist,
* Zurück konvertieren.
*
* MAIL_ADDRESS ⇒ MAILADDRESS ↓ mailaddress = mailAddress
* @param fieldName Feldname oder Spaltenname
* @return-Feldname
*/
privater statischer String checkFieldName(String fieldName) {
int index = fieldName.indexOf(“_”);
while (wahr) {
if (index == -1) {
return fieldName;
}
StringBuffer convcloumn = new StringBuffer(fieldName);
convcloumn.deleteCharAt(index);
fieldName = convcloumn.toString();
index = fieldName.indexOf(“_”);
}
}
/**
* Konvertiert das zu konvertierende Objekt object in den Typ convClassName.
*
* @param object Zu konvertierendes Objekt
* @param convClassName Klassenzeichenfolge des zu konvertierenden Typs
* @return das konvertierte Objekt
*/
privates statisches Objekt convObject(Object object, String convClassName) {
if (object == null) {
// Die Rückgabe von Null beim Konvertieren in einen primitiven Typ führt zu einem Fehler.
// Mach daraus einen Wrapper für 0.
if (convClassName.equals(“int”)) {
return new Integer(0);
} else if (convClassName.equals(“long”)) {
return new Long(0);
} anders {
null zurückgeben;
}
}
if (object.getClass().getName().equals(convClassName)) {
Rückgabeobjekt;
}
// —————————————-『Objektinstanz von String』
if (Objektinstanz von String) {
if (convClassName.equals(“java.lang.String”)) {
Rückgabeobjekt;
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
String str = (String) object;
if (isExist(str)) {
// Es wird schlecht sein, wenn Sie es nicht einmal in BigDecimal konvertieren
// 1000.00000
BigDecimal big = new BigDecimal(str);
return new Long(big.longValue());
} anders {
// Wenn str ein Shell-Literal ist, setze den Anfangswert auf „0“
return new Long(0);
}
} else if (convClassName.equals(“java.sql.Date”)) {
return toSqlDate((String) object);
} else if (convClassName.equals(“java.sql.Timestamp”)) {
Datum date = toSqlDate((String) object);
return new Timestamp(date.getTime());
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
// Wenn str ein Shell-Literal ist, setze den Anfangswert auf „0“
String str = (String) object;
if (isExist(str)) {
BigDecimal big = new BigDecimal(str);
return new Integer(big.intValue());
} anders {
return new Integer(0);
}
} else if (convClassName.equals(“boolean”)) {
return Boolean.valueOf(object.toString());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
String temp = ((String) object).trim();
// Wenn temp.length() == 0 ist, kann es sicher auf null statt auf 0 gesetzt werden.
if (temp.length() == 0) {
null zurückgeben;
} anders {
return new BigDecimal(temp);
}
}
throwNoSupprt(object, convClassName);
}
// ———————————“ Objektinstanz von java.sql.Date „
else if (Objektinstanz von java.sql.Date) {
if (convClassName.equals(“java.lang.String”)) {
return toStringDate((java.sql.Date) object, „yyyy/MM/dd“);
} else if (convClassName.equals(“java.sql.Date”)) {
Rückgabeobjekt;
} else if (convClassName.equals(“java.sql.Timestamp”)) {
return new Timestamp(((Date) object).getTime());
}
throwNoSupprt(object, convClassName);
}
// ————————————-『Objektinstanz des Zeitstempels』
else if (Objektinstanz des Zeitstempels) {
long time = ((Timestamp) object).getTime();
if (convClassName.equals(“java.lang.String”)) {
return toStringDate(time, „yyyy/MM/dd HH:mm:ss“);
} else if (convClassName.equals(“java.sql.Date”)) {
return new java.sql.Date(time);
} else if (convClassName.equals(“java.sql.Timestamp”)) {
Rückgabeobjekt;
}
throwNoSupprt(object, convClassName);
}
// —————————————-『Objektinstanz von Integer』
else if (Objektinstanz von Integer) {
if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
Rückgabeobjekt;
} else if (convClassName.equals(“java.lang.String”)) {
return object.toString();
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
return new Long(((Integer) object).longValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
return new BigDecimal(((Integer) object).intValue());
}
throwNoSupprt(object, convClassName);
}
// ——————————————『Objektinstanz von Long』
else if (Objektinstanz von Long) {
if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
Rückgabeobjekt;
} else if (convClassName.equals(“java.lang.String”)) {
return object.toString();
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
return new Integer(((Long) object).intValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
return new BigDecimal(((Long) object).longValue());
}
throwNoSupprt(object, convClassName);
}
// —————————————-『Objektinstanz von Double』
else if (Objektinstanz von Double) {
if (convClassName.equals(“java.lang.String”)) {
// SPALTENNUMMER(8,0)
// Windows Oracle > BigDecimal
// UNIX-Orakel > Double
BigDecimal big = new BigDecimal(((Double) object).doubleValue());
int scale = big.scale();
if (scale == 0) {
return big.toString();
} anders {
// Wird nicht unterstützt, wenn eine Rundung erforderlich ist.
throwNoSupprt(object, convClassName);
}
}
if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
return new Integer(((Double) object).intValue());
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
return new Long(((Double) object).longValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
return new BigDecimal(((Double) object).doubleValue());
}
throwNoSupprt(object, convClassName);
}
// ————————————“ Objektinstanz von BigDecimal „
else if (Objektinstanz von BigDecimal) {
if (convClassName.equals(“java.lang.String”)) {
return object.toString();
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
return new Long(((BigDecimal) object).longValue());
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
return new Integer(((BigDecimal) object).intValue());
}
throwNoSupprt(object, convClassName);
}
// —————————————-『Objektinstanz von Byte[]』
else if (Objektinstanz von Byte[]) {
if (convClassName.equals(“java.sql.Blob”)) {
Rückgabeobjekt;
}
throwNoSupprt(object, convClassName);
}
// ————————————————“ Objekt ist boolesch“
else if (Objektinstanz von Boolean) {
if (convClassName.equals(“boolean”)) {
Rückgabeobjekt;
}
throwNoSupprt(object, convClassName);
}
// ———————————————-『object is boolean[]』
else if (Objektinstanz von Boolean[]) {
if (convClassName.equals(“java.lang.String”)) {
boolean[] bs = (boolean[]) object;
StringBuffer buff = new StringBuffer(“[“);
for (int i = 0; i < bs.length; i++) {
buff.append(bs[i] + „“,);
}
buff.deleteCharAt(buff.length() – 1);
buff.append(“]”);
return buff.toString();
}
throwNoSupprt(object, convClassName);
}
throwNoSupprt(object, convClassName);
null zurückgeben;
}
/**
*Wird ausgelöst, wenn die Konvertierung nicht unterstützt wird.
*
* @param object Zu konvertierendes Objekt
* @param convClassName Typ zum Konvertieren
*/
private static void throwNoSupprt(Object object, String convClassName) {
String className = (object != null) ? object.getClass().getName()
: "Null";
String errorMess = „\nTypkonvertierungsverarbeitung für dieses Objekt wird noch nicht unterstützt.\n“
+ „[ Objekt ] = „ + Objekt + „,[ Objekttyp ] = „ + Klassenname
+ „,[ konvertierenKlasse ] =“ + convClassName + „“;
throw new UnsupportedOperationException(errorMess);
}
/**
* Konvertiert das Zeichen an Position [index] der Zeichenfolge [str] in Groß- oder Kleinbuchstaben.
* <p>
* @param str String, der ausgewertet werden soll
* @param index Angegebene Position
* @param toCase In Großbuchstaben umwandeln ⇒ U | u In Kleinbuchstaben umwandeln ⇒ L | l
* @return String nach der Konvertierung
*/
privater statischer String convString(String str, int index, String toCase) {
if (str == null || str.trim().length() == 0) {
return str;
} anders {
String temp = str.substring(index, index + 1);
if (toCase.equalsIgnoreCase(„u“)) {
temp = temp.toUpperCase();
} anders {
temp = temp.toLowerCase();
}
StringBuffer tempBuffer = new StringBuffer(str);
tempBuffer.replace(index, index + 1, temp);
return tempBuffer.toString();
}
}
/**
* Überprüfen Sie, ob [Wert] ein gültiger Wert ist.
*
* @param value String, der ausgewertet werden soll
* @return [true]: Wenn nicht null und nicht „“
*/
privater statischer boolescher Wert isExist(String value) {
if (value != null && value.length() != 0) {
return true;
}
falsch zurückgeben;
}
/**
* java.util.Date-Klasse oder ihre Unterklasse im angegebenen Format
* In String konvertieren.
* @param date java.util.Date-Klasse, die konvertiert werden soll
* @param-Muster angegebenes Format
* @return-formatierte Datumszeichenfolge
*/
privater statischer String toStringDate(Datumsdatum, Stringmuster) {
SimpleDateFormat sdFormat = new SimpleDateFormat(pattern);
return sdFormat.format(date);
}
private static java.sql.Date toSqlDate(String strDate) {
Kalender cal = toCalendar(strDate);
return toSqlDate(cal);
}
private static java.sql.Date toSqlDate(Calendar cal) {
long l = cal.getTime().getTime();
return new java.sql.Date(l);
}
/**
* Konvertiert einen Langzeitwert in eine Zeichenfolge im angegebenen Format.
* @param time Ein langer Wert, der Millisekunden der aktuellen Zeit darstellt.
* @param-Muster angegebenes Format
* @return-formatierte Datumszeichenfolge
*/
privater statischer String toStringDate(lange Zeit, String-Muster) {
return toStringDate(new Date(time), pattern);
}
/**
* String ⇒ java.sql.Date
*
* Konvertieren Sie die folgende Datumszeichenfolge in java.sql.Date
* jjjj/MM/tt HH:mm:ss.SSS jjjj-MM-tt HH:mm:ss.SSS
*
* “20030407” “2003/04/07” “2003-04-07” “2003/04/07 15:20:16” “2003-04-07
* 15:20:16”
* @param strDate
* @zurückkehren
*/
privater statischer Kalender toCalendar(String strDate) {
strDate = format(strDate);
Kalender cal = Calendar.getInstance();
int yyyy = Integer.parseInt(strDate.substring(0, 4));
int MM = Integer.parseInt(strDate.substring(5, 7));
int dd = Integer.parseInt(strDate.substring(8, 10));
int HH = cal.get(Calendar.HOUR_OF_DAY);
int mm = cal.get(Calendar.MINUTE);
int ss = cal.get(Calendar.SECOND);
int SSS = cal.get(Calendar.MILLISECOND);
cal.clear();
cal.set(yyyy, MM – 1, dd);
int len = strDate.length();
Schalter (len) {
Fall 10:
brechen;
Fall 16: // jjjj/MM/tt HH:mm
HH = Integer.parseInt(strDate.substring(11, 13));
mm = Integer.parseInt(strDate.substring(14, 16));
cal.set(Calendar.HOUR_OF_DAY, HH);
cal.set(Calendar.MINUTE, mm);
brechen;
Fall 19: // jjjj/MM/tt HH:mm:ss
HH = Integer.parseInt(strDate.substring(11, 13));
mm = Integer.parseInt(strDate.substring(14, 16));
ss = Integer.parseInt(strDate.substring(17, 19));
cal.set(Calendar.HOUR_OF_DAY, HH);
cal.set(Calendar.MINUTE, mm);
cal.set(Calendar.SECOND, ss);
brechen;
Fall 23: // yyyy/MM/dd HH:mm:ss.SSS
HH = Integer.parseInt(strDate.substring(11, 13));
mm = Integer.parseInt(strDate.substring(14, 16));
ss = Integer.parseInt(strDate.substring(17, 19));
SSS = Integer.parseInt(strDate.substring(20, 23));
cal.set(Calendar.HOUR_OF_DAY, HH);
cal.set(Calendar.MINUTE, mm);
cal.set(Calendar.SECOND, ss);
cal.set(Calendar.MILLISECOND, SSS);
brechen;
Standard:
wirf eine neue IllegalStateException(
„Diese Zeichenfolge kann nicht in eine Datumszeichenfolge umgewandelt werden:“
+ strDate);
}
return cal;
}
/**
* Beliebige Datumszeichenfolge als „jjjj/MM/tt“ oder „jjjj/MM/tt HH:mm:ss“
* Versucht, in ein Format zu konvertieren.
* Beispiel: 03.01.03 ⇒ 03.01.2003
* @param strDate
* @zurückkehren
*/
privates statisches String-Format(String strDate) {
strDate = strDate.trim();
String yyyy = null;
Zeichenfolge MM = null;
String dd = null;
Zeichenfolge HH = null;
Zeichenfolge mm = null;
String ss = null;
Zeichenfolge SSS = null;
// Wenn „-“ oder „/“ fehlt
if (strDate.indexOf(“/”) == -1 && strDate.indexOf(“-“) == -1) {
if (strDate.length() == 8) {
yyyy = strDate.substring(0, 4);
MM = strDate.substring(4, 6);
dd = strDate.substring(6, 8);
return yyyy + „/“ + MM + „/“ + dd;
} anders {
yyyy = strDate.substring(0, 4);
MM = strDate.substring(4, 6);
dd = strDate.substring(6, 8);
HH = strDate.substring(9, 11);
mm = strDate.substring(12, 14);
ss = strDate.substring(15, 17);
return yyyy + „/“ + MM + „/“ + dd + „ „ + HH + „:“ + mm + „:“
+ss;
}
}
StringTokenizer token = new StringTokenizer(strDate, „_/-:. „);
StringBuffer result = new StringBuffer();
for (int i = 0; token.hasMoreTokens(); i++) {
String temp = token.nextToken();
Schalter (i) {
Fall 0:// Jahresteil
yyyy = fillString(strDate, temp, „f“, „20“, 4);
result.append(yyyy);
brechen;
Fall 1:// Monatsteil
MM = fillString(strDate, temp, „f“, „0“, 2);
result.append(“/” + MM);
brechen;
Fall 2:// Tagesteil
dd = fillString(strDate, temp, „f“, „0“, 2);
result.append(“/” + dd);
brechen;
Fall 3:// Zeitteil
HH = fillString(strDate, temp, „f“, „0“, 2);
result.append(“ ” + HH);
brechen;
Fall 4:// Minutenteil
mm = fillString(strDate, temp, „f“, „0“, 2);
result.append(“:” + mm);
brechen;
Fall 5:// zweiter Teil
ss = fillString(strDate, temp, „f“, „0“, 2);
result.append(“:” + ss);
brechen;
Fall 6:// Millisekundenteil
SSS = fillString(strDate, temp, „b“, „0“, 3);
result.append(“.” + SSS);
brechen;
}
}
return result.toString();
}
privater statischer String fillString(String strDate, String str,
String-Position, String addStr, int len) {
if (str.length() > len) {
String mes = strDate + „Dieser String-String kann nicht in einen Datums-String konvertiert werden“;
throw new IllegalStateException(mes);
}
return fillString(str, position, addStr, len);
}
/**
* Fügen Sie die Zeichenfolge [addStr] hinzu, die zur Zeichenfolge [str] an [Position] in [len] hinzugefügt werden soll.
* Bis zum Füllen einführen.
* <p>
* Beispiel: String ss = StringUtil.fillString(„aaa“, „b“, „0“, 7); ss ⇒ „aaa0000“
*
* *fillString() fügt ein, bis len gefüllt ist, aber addString() fügt len ein.
*
* @param str Zielzeichenfolge
* @param position Einfügen vor ⇒ F/f Einfügen nach ⇒ B/b
* @param addStr String zum Einfügen
* @param len Anzahl der aufzufüllenden Ziffern
* @return Der String nach der Konvertierung. [str] ist null oder ein leeres Literal, [addStr] ist auf [len] gesetzt.
* Gibt eingefügte Ergebnisse zurück, bis sie zufrieden sind.
*/
privater statischer String fillString(String str, String-Position,
String addStr, int len) {
StringBuffer tempBuffer = null;
if (!isExist(str)) {
tempBuffer = new StringBuffer();
for (int i = 0; i < len; i++) {
tempBuffer.append(addStr);
}
return tempBuffer.toString();
} else if (str.length() != len) {
tempBuffer = new StringBuffer(str);
while (len > tempBuffer.length()) {
if (position.equalsIgnoreCase(“f”)) {
tempBuffer.insert(0, addStr);
} anders {
tempBuffer.append(addStr);
}
}
return tempBuffer.toString();
}
return str;
}
}