La réflexion Java simplifiée
JavaderéflexionPrésentation d'une classe utilitaire qui vous permet d'utiliser facilement l'API.
Qu'est-ce que la réflexion ?
API de réflexiondents,"java.lang.reflect» inclus dans le forfait,
Il s'agit d'une API qui récupère des informations telles que les champs et les méthodes des classes Java.
Les classes suivantes sont principalement utilisées.
- java.lang.Class
- java.lang.reflect.Constructeur
- java.lang.reflect.Méthode
- java.lang.reflect.Field
réflexionEn utilisant , vous pouvez créer des classes ou appeler des méthodes sans avoir à les coder directement.
Vous pouvez créer une instance de classe à partir d'une chaîne ou exécuter une méthode.
En écrivant les définitions des noms de classe et des noms de méthodes dans des fichiers externes tels que XML, vous pouvez adapter dynamiquement l'application aux changements de l'environnement pendant l'exécution.
C'est également une API très efficace pour créer des applications très flexibles.
Objectif de la réflexion
réflexionn'est pas souvent utilisé directement par les utilisateurs,
Il est largement utilisé dans les applications Web telles que Struts et les frameworks tels que le mappage O/R.
Par exemple, lors de la définition automatique des données d'entrée de l'écran Web sur les propriétés JavaBeans,
Il est utilisé lors de l'émission de SQL qui se met automatiquement à jour en fonction des propriétés JavaBeans.
De plus, des fonctions telles que le chargement et l'enregistrement dynamiques de plug-ins qui étendent les fonctionnalités au démarrage de l'application sont disponibles.réflexionCeci peut être facilement réalisé en utilisant .
Exécution de l'échantillon
Veuillez exécuter l'exemple et expérimenter une programmation de type framework.
Ici, nous utilisons la classe suivanteréflexionMontre une utilisation simple de l’utilitaire.
Main.java...Classe à exécuter
BeanUtil.java...Classe utilitaire de réflexion
FreeSoft.java...Utilisé comme réflexion dans une classe qui représente le logiciel libre.
●Lorsqu'il est exécuté normalement
FreeSoft freeSoft = nouveau FreeSoft();
freeSoft.setName(« Chat&Messenger Chat et Messenger !! »);
freeSoft.showName();
freeSoft.showPrice(0);
●Lorsqu'il est exécuté en utilisant la réflexion
//Créer une instance de la classe FreeSoft
Objet InvocationObject = BeanUtil.newInstance(« Logiciel Libre »);
//Définissez la valeur dans le champ de nom.
BeanUtil.setProperty(invokeObject, "nom" , "Chat&Messenger Chat et Messenger !!");
// Exécute la méthode showName() de FreeSoft.
BeanUtil.invoke(invokeObject, "showName", nul);
// Exécute la méthode showPrice() de FreeSoft.
// Si la méthode a des arguments, ils doivent être passés sous forme de tableau de type Objet.
BeanUtil.invoke(invokeObject, « afficher le prix »,nouvel Objet[]{nouvel Entier(0)});
●Résultats d'exécution
Les résultats d'exécution sont les mêmes que ce soit dans le cas normal ou lors de l'utilisation de la réflexion.
Nom du logiciel : Chat&Messenger Chat et messagerie ! !
Prix : 0 yen
>>> Lors de l'utilisation de la réflexion
Nom du logiciel : Chat&Messenger Chat et messagerie ! !
Prix : 0 yen
Détails de la méthode BeanUtil
nouvelleInstance
objet statique public nouvelleInstance(String className) lève une exception
- Génère et renvoie une instance à partir de la chaîne "className".
-
- Paramètres:
nom du cours
– Nom de classe complet- Valeur de retour :
- Une nouvelle instance d'un nom de classe complet
- exception:
Exception
nouvelleInstance
objet statique public nouvelleInstance(String className, Object[] argObj) lève une exception
- Génère et renvoie une instance à partir de la chaîne "className".
-
- Paramètres:
nom du cours
– Nom de classe completargObj
– Arguments du constructeur- Valeur de retour :
- Une nouvelle instance d'un nom de classe complet
- exception:
Exception
nouvelleInstance
objet statique public nouvelleInstance(Classe Clazz) lève une exception
- Génère et renvoie une instance de la classe "clazz".
-
- Paramètres:
clazz
- classe- Valeur de retour :
- nouvelle instance de clazz
- exception:
Exception
nouvelleInstance
objet statique public nouvelleInstance(Classe clazz, Object[] argObj) lève une exception
- Génère et renvoie une instance de la classe "clazz".
-
- Paramètres:
clazz
- classeargObj
– Arguments du constructeur- Valeur de retour :
- nouvelle instance de clazz
- exception:
Exception
setProperty
Vide public statique setProperty(Object InvokeObject, String fieldName, Object value) lève une exception
- Appelez la méthode setter du champ "fieldName" de l'objet "invokeObject" et stockez la valeur "value".
S'il n'y a pas de méthode de définition, la valeur sera définie directement sur le champ. Cependant, dans ce cas, le modificateur d'accès de la propriété cible doit être public.
-
- Paramètres:
invoquerObjet
– Objet à exécuternom de domaine
– Nom de la propriété de l’objet à exécutervaleur
– Valeur à définir- exception:
Exception
– L'exception suivante se produit.InvocationTargetExceptionInvocationTargetException
– Si la méthode sous-jacente lève une exceptionException d'accès illégal
– Cet objet méthode est Java
Lorsque le contrôle d'accès à la langue est implémenté et que la méthode sous-jacente n'est pas accessibleNoSuchMethodException
– Si une méthode portant le nom spécifié n'est pas trouvée
obtenirPropriété
objet statique public obtenirPropriété(Object EnsureObject, String fieldName) lève une exception
- Appelle la méthode getter du champ fieldName de l'objet EnsureObject pour obtenir la valeur.
S'il n'y a pas de méthode getter, la valeur sera récupérée directement du champ. Cependant, dans ce cas, le modificateur d'accès de la propriété cible doit être public. -
- Paramètres:
invoquerObjet
– Objet à exécuternom de domaine
– Nom de la propriété de l’objet à exécuter- Valeur de retour :
- Valeur de retour de la méthode Getter
- exception:
Exception
– L'exception suivante se produit.InvocationTargetExceptionInvocationTargetException
– Si la méthode sous-jacente lève une exceptionException d'accès illégal
– Cet objet méthode est Java
Lorsque le contrôle d'accès à la langue est implémenté et que la méthode sous-jacente n'est pas accessibleNoSuchFieldException
– Si un champ portant le nom spécifié n'est pas trouvé
invoquer
objet statique public invoquer(Object InvokeObject, String callMethod, Object[] argObjects) lève InvocationTargetException, IllegalAccessException, NoSuchMethodException
- Exécute la méthode "callMethod" de l'objet "invokeObject".
S'il existe une valeur de retour, elle peut être obtenue sous forme d'objet. -
- Paramètres:
invoquerObjet
– Objet à exécuterméthode d'appel
– Nom de la méthode à exécuterObjetsarg
– S'il y a des arguments, transmettez-les sous forme de tableau d'objets. S'il n'y a aucun argument, transmettez null.- Valeur de retour :
- Valeur de retour de l'exécution de "callMethod"
- exception:
InvocationTargetExceptionInvocationTargetException
– Si la méthode sous-jacente lève une exceptionException d'accès illégal
– Cet objet méthode est Java
Lorsque le contrôle d'accès à la langue est implémenté et que la méthode sous-jacente n'est pas accessibleNoSuchMethodException
– Si une méthode portant le nom spécifié n'est pas trouvée
méthode de recherche
méthode statique publique méthode de recherche(Object InvokeObject, String callMethod, Object[] argObjects) lève NoSuchMethodException
- Recherchez la méthode 'callMethod' de l'objet 'invokeObject'.
-
- Paramètres:
invoquerObjet
– Objet à exécuterméthode d'appel
– Nom de la méthode de l’objet à exécuterObjetsarg
– S'il y a des arguments, transmettez-les sous forme de tableau d'objets. S'il n'y a aucun argument, transmettez null.- Valeur de retour :
- Un objet Method qui correspond aux conditions d'argument spécifiées
- exception:
NoSuchMethodException
– Si aucune méthode de correspondance n’est trouvée, ou si le nom est « » ou « »
setField
Vide public statique setField(Object EnsureObject, String fieldName, Object value) lève IllegalAccessException, NoSuchFieldException
- Stocke la valeur "value" dans le nom de champ "fieldName" de l'objet à exécuter "invokeObject".
-
- Paramètres:
invoquerObjet
– Objet à exécuternom de domaine
– Nom du champ de l’objet à exécutervaleur
– Valeur à définir- exception:
Exception d'accès illégal
– Le champ sur lequel l'objet spécifié est basé (ou sa sous-classe ou son implémenteur)
n'est pas une instance de la classe ou de l'interface qu'il déclare, ou si la conversion de déballage échoueNoSuchFieldException
– Si un champ portant le nom spécifié n'est pas trouvé
obtenirField
objet statique public obtenirField(Object InvokeObject, String fieldName) lève IllegalAccessException, NoSuchFieldException
- Obtient la valeur du nom de champ "fieldName" de l'objet à exécuter "invokeObject".
-
- Paramètres:
invoquerObjet
– Objet à exécuternom de domaine
– Nom du champ de l’objet à exécuter- Valeur de retour :
- valeur de retour
- exception:
Exception d'accès illégal
– Le champ sur lequel l'objet spécifié est basé (ou sa sous-classe ou son implémenteur)
n'est pas une instance de la classe ou de l'interface qu'il déclare, ou si la conversion de déballage échoueNoSuchFieldException
– Si un champ portant le nom spécifié n'est pas trouvé
hasField
booléen statique public hasField(Objet Objet, String fieldName) lève une exception
- Vérifie si l'objet 'object' déclare le nom du champ 'fieldName'.
-
- Paramètres:
objet
– Objet à inspecternom de domaine
– Nom du champ à vérifier- Valeur de retour :
- vrai si déclaré
- exception:
Exception
getAllFields
public statique java.util.TreeSet getAllFields(Objet objet) lève une exception
-
- Paramètres:
objet
–- Valeur de retour :
- exception:
Exception
getShortClassName
Chaîne statique publique getShortClassName(Objet Objet)
- Obtient le nom de classe non qualifié d'un objet.
-
- Paramètres:
objet
–- Valeur de retour :
getShortClassName
Chaîne statique publique getShortClassName(Nom de classe de chaîne)
- Obtient le nom de classe à partir du nom complet.
-
- Paramètres:
nom du cours
–- Valeur de retour :
getFieldName
Chaîne statique publique getFieldName(Nom de la méthode de chaîne)
- Modifiez le nom du champ à partir du nom de la méthode. Doit être conforme aux conventions JavaBeans.
-
- Paramètres:
NomMéthode
–- Valeur de retour :
estClassExist
booléen statique public estClassExist(Nom de classe de chaîne)
- Vérifie que le nom complet « className » est un nom de classe existant.
-
- Paramètres:
nom du cours
–- Valeur de retour :
getPropertyDescriptors
Descripteur de propriété statique public[] getPropertyDescriptors(Objet objet) lance IntrospectionException
- Renvoie un PropertyDescriptor qui contient des informations sur l'objet pour « objet ».
-
- Paramètres:
objet
–- Valeur de retour :
- exception:
java.beans.IntrospectionException
Code source de BeanUtil
/**
* Classe utilitaire qui vous permet d'utiliser facilement l'API de réflexion de Java
*/
classe publique BeanUtil {
/** */
chaîne finale statique privée GET = « GET » ;
/** */
Chaîne finale statique privée SET = « SET » ;
// ———————————————————-『nouvelleInstance』
/**
* Génère et renvoie une instance à partir de la chaîne "className".
* @param className nom de classe complet
* @return nouvelle instance du nom de classe complet
* @jette une exception
*/
L'objet statique public newInstance (String className) lève une exception {
essayer {
return Class.forName(className).newInstance();
} catch (NoClassDefFoundErrore) {
System.err.println(« NoClassDefFoundError : » + className);
lancez e;
}
}
/**
* Génère et renvoie une instance à partir de la chaîne "className".
* @param className nom de classe complet
* Argument du constructeur @param argObj
* @return nouvelle instance du nom de classe complet
* @jette une exception
*/
Objet statique public newInstance (String className, Object[] argObj)
lance une exception {
Class[] argClass = new Class[argObj.length];
pour (int i = 0; i < argObj.length; i++) {
argClass[i] = argObj[i].getClass();
}
Constructeur c = Class.forName(className).getConstructor(argClass);
return c.newInstance(argObj);
}
/**
* Créez et renvoyez une instance de la classe 'clazz'.
* Classe @param clazz
* @return nouvelle instance de clazz
* @jette une exception
*/
L'objet statique public newInstance (classe clazz) lève une exception {
return clazz.newInstance();
}
/**
* Créez et renvoyez une instance de la classe 'clazz'.
* Classe @param clazz
* Argument du constructeur @param argObj
* @return nouvelle instance de clazz
* @jette une exception
*/
Objet statique public newInstance (Classe clazz, Objet [] argObj)
lance une exception {
Class[] argClass = new Class[argObj.length];
pour (int i = 0; i < argObj.length; i++) {
argClass[i] = argObj[i].getClass();
}
Constructeur c = clazz.getConstructor(argClass);
return c.newInstance(argObj);
}
// ---------------------"Méthode"
/**
* Méthode de définition du champ "fieldName" de l'objet "invokeObject"
* Appelez, stockez la valeur « valeur ».
* <br>
* S'il n'y a pas de méthode de définition, définissez la valeur directement sur le champ.
* Cependant, dans ce cas, le modificateur d'accès de la propriété cible doit être public.
* @param EnsureObject Objet à exécuter
* @param fieldName Nom de la propriété de l'objet à exécuter
* @param value valeur à définir
* Exception @throws L'exception suivante se produit.
* @throws InvocationTargetException si la méthode sous-jacente lève une exception
* @throws IllegalAccessException Si cet objet méthode est Java
* Lorsque le contrôle d'accès à la langue est implémenté et que la méthode sous-jacente n'est pas accessible
* @throws NoSuchMethodException si une méthode portant le nom spécifié n'est pas trouvée
*/
public static void setProperty (Object invoquéObject, String fieldName,
Valeur de l'objet) lève une exception {
essayer {
Méthode méthode = searchMethod(invokeObject, fieldName, SET);
Class[] paramClasses = method.getParameterTypes();
Objet[] valueArray = null ;
if (paramClasses[0].isInstance(value)) {
//Ne pas convertir si l'objet à définir est une sous-classe de la classe d'argument.
valueArray = new Object[] { valeur } ;
} autre {
valueArray = nouvel objet[] { convObject(value, paramClasses[0]
.getName()) };
}
method.invoke(invokeObject, valueArray);
} catch (NoSuchMethodException e) {
essayer {
// S'il n'y a pas de méthode setter, définissez-la directement sur le champ.
setField (invokeObject, fieldName, valeur);
} catch (NoSuchFieldException fe) {
Chaîne errorMes = « \nClass » + getShortClassName (invokeObject)
+ "est" + "pour le champ "" + nom du champ + ""\n"
+ "Il n'existe pas de méthode de définition accessible, et."
+ « Champ « » + Nom du champ
+ "" n'est pas non plus public. " + " " ;
lancer une nouvelle IllegalAccessException (errorMes);
}
}
}
/**
* Méthode Getter du champ fieldName de l'objet EnsureObject
* Obtenez la valeur de l'appel. <br>
* S'il n'y a pas de méthode getter, la valeur sera obtenue directement du champ.
* Cependant, dans ce cas, le modificateur d'accès de la propriété cible doit être public.
* @param EnsureObject Objet à exécuter
* @param fieldName Nom de la propriété de l'objet à exécuter
* @return valeur de retour de la méthode getter
* Exception @throws L'exception suivante se produit.
* @throws InvocationTargetException si la méthode sous-jacente lève une exception
* @throws IllegalAccessException Si cet objet méthode est Java
* Lorsque le contrôle d'accès à la langue est implémenté et que la méthode sous-jacente n'est pas accessible
* @throws NoSuchFieldException si un champ portant le nom spécifié n'est pas trouvé
*/
Objet statique public getProperty (Objet InvoquerObject, String fieldName)
lance une exception {
essayer {
Méthode méthode = searchMethod(invokeObject, fieldName, GET);
return method.invoke(invokeObject, null);
} catch (NoSuchMethodException e) {
return getField (invokeObject, fieldName);
}
}
/**
* Exécute la méthode "callMethod" de l'objet "invokeObject".
* S'il existe une valeur de retour, elle peut être obtenue sous forme de type Objet.
* @param EnsureObject Objet à exécuter
* @param callMethod Nom de la méthode à exécuter
* @param argObjects S'il y a un argument, transmettez-le sous forme de tableau d'objets.
* Passez null s'il n'y a pas d'argument.
* @return Valeur de retour de l'exécution de "callMethod"
* @throws InvocationTargetException si la méthode sous-jacente lève une exception
* @throws IllegalAccessException Si cet objet méthode est Java
* Lorsque le contrôle d'accès à la langue est implémenté et que la méthode sous-jacente n'est pas accessible
* @throws NoSuchMethodException si une méthode portant le nom spécifié n'est pas trouvée
*/
appel d'objet statique public (objet invoquerobjet, chaîne callMethod,
Object[] argObjects) lance InvocationTargetException,
IllegalAccessException, NoSuchMethodException {
Méthode méthode = findMethod(invokeObject, callMethod, argObjects);
return method.invoke(invokeObject, argObjects);
}
/**
* Recherchez la méthode 'callMethod' de l'objet 'invokeObject'.
* @param EnsureObject Objet à exécuter
* @param callMethod Nom de la méthode de l'objet à exécuter
* @param argObjects S'il y a un argument, transmettez-le sous forme de tableau d'objets.
* Passez null s'il n'y a pas d'argument.
* Objet de méthode @return qui correspond aux conditions d'argument spécifiées
* @throws NoSuchMethodException Si aucune méthode correspondante n'est trouvée,
* Ou si le nom est « " ou " "dans le cas d
*/
Méthode statique publique findMethod (Object InvookeObject, String callMethod,
Object[] argObjects) lance NoSuchMethodException {
Classe[] paramClasses = null;
Méthodes Method[] = InvoquerObject.getClass().getMethods();
haut : pour (int i = 0 ; i < méthodes.length ; i++) {
if (methods[i].getName().equals(callMethod)) {
si (argObjects == null
&& méthodes[i].getParameterTypes().length == 0) {
méthodes de retour[i] ;
}
si (argObjects == null) {
continuer;
}
paramClasses = méthodes[i].getParameterTypes();
if (paramClasses.length == argObjects.length) {
// Valide tous les types de liste de paramètres et types d'arguments
pour (int j = 0; j < paramClasses.length; j++) {
Classe paramClass = paramClasses[j];
Objet argObj = argObjects[j];
// Si le type d'argument est primitif, l'objet argument
// n'est pas nul et est primitif
//Si c'est une sous-classe de Number, c'est OK.
si (argObj == null) {
continuer;
}
si (paramClass.isPrimitive()
&& (argObj instance du Nombre || argObj
.getClass().isPrimitive())) {
continuer;
}
si (!paramClass.isInstance(argObj)) {
// Passe à la méthode suivante lorsque les types ne sont pas compatibles avec la conversion implicite
continuez en haut ;
}
}
méthodes de retour[i] ;
}
}
}
Chaîne paramLength = (paramClasses != null) ? Entier
.toString(paramClasses.length) : "";
String errorMes = getShortClassName (invokeObject) + « méthode »
+ callMethod + "Il n'y a pas." + "[ paramClasses.length ] = "
+ paramLength + « ,[ argObjects.length ] = » + argObjects.length
+ “”;
lancer une nouvelle NoSuchMethodException (errorMes);
}
// ----------------------"Champ"
/**
* Valeur du nom de champ "fieldName" de l'objet "invokeObject" à exécuter
* Stocke la « valeur ».
* @param EnsureObject Objet à exécuter
* @param fieldName Nom du champ de l'objet à exécuter
* @param value valeur à définir
* @throws IllegalAccessException Si l'objet spécifié est
* champ (ou sa sous-classe ou implémenteur)
* S'il ne s'agit pas d'une instance d'une classe ou d'une interface, déclarez
* ou si la conversion de déballage échoue
* @throws NoSuchFieldException si un champ portant le nom spécifié n'est pas trouvé
*/
public static void setField (Object invoquéObject, String fieldName,
Valeur de l'objet) lance IllegalAccessException, NoSuchFieldException {
Champ field = searchField(invokeObject, fieldName);
String className = field.getType().getName();
Objet convObj = null ;
if (field.getType().isInstance(value)) {
convObj = valeur ;
} autre {
convObj = convObject(value, className);
}
field.set(invokeObject, convObj);
}
/**
* Définissez la valeur du nom de champ "fieldName" de l'objet d'exécution "invokeObject" sur
* Obtenir.
* @param EnsureObject Objet à exécuter
* @param fieldName Nom du champ de l'objet à exécuter
* @return valeur de retour
* @throws IllegalAccessException Si l'objet spécifié est
* champ (ou sa sous-classe ou implémenteur)
* S'il ne s'agit pas d'une instance d'une classe ou d'une interface, déclarez
* ou si la conversion de déballage échoue
* @throws NoSuchFieldException si un champ portant le nom spécifié n'est pas trouvé
*/
Objet statique public getField (Object EnsureObject, String fieldName)
lance IllegalAccessException, NoSuchFieldException {
Champ field = searchField(invokeObject, fieldName);
return field.get(invokeObject);
}
/**
* Vérifiez si l'objet "object" déclare le nom du champ "fieldName"
* confirmer.
* @param object Objet à inspecter
* @param fieldName Nom du champ à inspecter
* @return true si déclaré
* @jette une exception
*/
public static boolean hasField (objet Object, String fieldName)
lance une exception {
PropertyDescriptor[] props = getPropertyDescriptors(object);
pour (int i = 0; i < props.length; i++) {
String _fieldName = props[i].getName();
if (fieldName.equals(_fieldName)) {
renvoie vrai ;
}
}
renvoie faux ;
}
/**
*
* Objet @param
* @retour
* @jette une exception
*/
public static TreeSet getAllFields (objet Object) lève une exception {
TreeSet fieldSet = new TreeSet();
// Récupère le nom de la propriété à partir de la méthode
PropertyDescriptor[] props = getPropertyDescriptors(object);
pour (int i = 0; i < props.length; i++) {
Chaîne fieldName = props[i].getName();
fieldSet.add(fieldName);
}
// Récupère le nom de la propriété à partir du champ
Champs Field[] = object.getClass().getFields();
pour (int i = 0; i < champs.longueur; i++) {
Chaîne fieldName = field[i].getName();
si (!fieldSet.contains(fieldName)) {
fieldSet.add(fieldName);
}
}
retourner fieldSet ;
}
/**
*
* @param EnsureObject Objet à exécuter
* @param fieldName Nom du champ de l'objet à exécuter
* @return Objets classés qui correspondent aux conditions d'argument spécifiées
* @throws NoSuchFieldException si un champ portant le nom spécifié n'est pas trouvé
*/
Champ statique privé searchField (Objet InvoquerObject, String fieldName)
lance NoSuchFieldException {
essayer {
return InvoquerObject.getClass().getField(fieldName);
} catch (NoSuchFieldException e) {
// Cette portée est obtenue à partir du nom de la colonne de la table
fieldName = checkFieldName(fieldName);
Champs Field[] = InvoquerObject.getClass().getFields();
pour (int i = 0; i < champs.longueur; i++) {
if (fields[i].getName().equalsIgnoreCase(fieldName)) {
champs de retour[i] ;
}
}
lancer une nouvelle NoSuchFieldException (fieldName);
}
}
// ----------------------" autres "
/**
* Obtenez le nom de classe non qualifié d'un objet.
* Objet @param
* @retour
*/
public static String getShortClassName (objet objet) {
si (objet == null) {
renvoyer « nul » ;
}
Nom de la chaîne = object.getClass().getName();
return getShortClassName(nom);
}
/**
* Obtenez le nom de la classe à partir du nom complet.
* @param nom de classe
* @retour
*/
chaîne statique publique getShortClassName (String className) {
int index = className.lastIndexOf(".");
return className.substring(index + 1);
}
/**
* Modifiez le nom du champ à partir du nom de la méthode. Conforme aux conventions JavaBeans
* est nécessaire.
* @param nom_méthode
* @retour
*/
public static String getFieldName (String methodName) {
Chaîne fieldName = null ;
if (methodName.startsWith("est")) {
fieldName = methodName.substring(2);
} autre {
fieldName = methodName.substring(3);
}
fieldName = convString(fieldName, 0, « L »);
retourner le nom du champ ;
}
/**
* Vérifiez que le nom complet « className » est un nom de classe existant.
* @param nom de classe
* @retour
*/
public static boolean isClassExist (String className) {
essayer {
Class.forName(className);
renvoie vrai ;
} attraper (Exception e) {
renvoie faux ;
}
}
Private final static Map beanInfoCache = new HashMap();
/**
* Renvoie un PropertyDescriptor qui contient des informations sur l'objet "objet".
* Objet @param
* @retour
* @throws IntrospectionException
*/
public static PropertyDescriptor[] getPropertyDescriptors (objet Object)
lance IntrospectionException {
BeanInfo beanInfo = (BeanInfo) beanInfoCache.get(object.getClass());
si (beanInfo == null) {
beanInfo = Introspector.getBeanInfo(object.getClass());
beanInfoCache.put(object.getClass(), beanInfo);
}
// BeanInfo beanInfo = Introspector.getBeanInfo(object.getClass());
return beanInfo.getPropertyDescriptors();
}
// ————————————————————————–
// ———————————————« Méthode privée ci-dessous »
// ————————————————————————–
/**
* Recherchez la méthode d'accesseur pour l'argument fieldName basée sur PropertyDescriptor.
* @param EnsureObject Objet à exécuter
* @param fieldName nom du champ
* @param type Méthode Getter ⇒ GET Méthode Getter ⇒ SET
* Objet de méthode @return qui correspond aux conditions d'argument spécifiées
* @throws NoSuchMethodException Si aucune méthode correspondante n'est trouvée,
* Ou si le nom est « " ou " »
* dans le cas d
* @throws IntrospectionException
*/
Méthode statique privée searchMethod (Object EnsureObject, String fieldName,
Type de chaîne) lance NoSuchMethodException, IntrospectionException {
Méthode méthode = null ;
fieldName = checkFieldName(fieldName);
PropertyDescriptor[] props = getPropertyDescriptors(invokeObject);
pour (int i = 0; i < props.length; i++) {
Nom de la chaîne = props[i].getName();
if (!name.equalsIgnoreCase(fieldName)) {
continuer;
}
if (type.equals(GET)) {
method = props[i].getReadMethod();
} autre {
method = props[i].getWriteMethod();
}
si (méthode == null) {
continuer;
}
méthode de retour ;
}
// Si la méthode n'existe pas.
lancez une nouvelle NoSuchMethodException ("La classe n'a pas de méthodes."
+ "(Insensible à la casse.): " + type.toLowerCase()
+ convString(fieldName, 0, "U") + "()");
}
/**
* Vérifie si l'argument fieldName est un nom de colonne ; si c'est un nom de colonne,
* Reconvertissez.
*
* MAIL_ADDRESS ⇒ MAILADDRESS ↓ adresse mail = mailAddress
* @param fieldName nom du champ ou nom de la colonne
* Nom du champ @return
*/
chaîne statique privée checkFieldName (String fieldName) {
int index = fieldName.indexOf("_");
tandis que (vrai) {
si (index == -1) {
retourner le nom du champ ;
}
StringBuffer convcloumn = new StringBuffer(fieldName);
convcloumn.deleteCharAt(index);
fieldName = convcloumn.toString();
index = fieldName.indexOf("_");
}
}
/**
* Convertit l'objet à convertir, objet, en type de convClassName.
*
* @param object Objet à convertir
* @param convClassName chaîne de classe du type à convertir
* @renvoie l'objet converti
*/
Objet statique privé convObject (objet Object, String convClassName) {
si (objet == null) {
// Le retour de null lors de la conversion en type primitif entraînera une erreur.
// Faites-en un wrapper pour 0.
if (convClassName.equals("int")) {
renvoie un nouvel entier (0);
} else if (convClassName.equals("long")) {
renvoie un nouveau Long(0);
} autre {
renvoie null ;
}
}
if (object.getClass().getName().equals(convClassName)) {
renvoyer l'objet ;
}
// —————————————-『instance d'objet de String』
if (instance d'objet de String) {
if (convClassName.equals("java.lang.String")) {
renvoyer l'objet ;
} sinon if (convClassName.equals("java.lang.Long")
|| convClassName.equals("long")) {
String str = (String) objet ;
si (isExist(str)) {
// Ce sera mauvais si vous ne le convertissez pas une fois en BigDecimal
// 1000.00000
BigDecimal big = new BigDecimal(str);
return new Long(big.longValue());
} autre {
// Si str est un littéral shell, définissez la valeur initiale sur « 0 »
renvoie un nouveau Long(0);
}
} sinon if (convClassName.equals("java.sql.Date")) {
retourner àSqlDate(objet(String));
} else if (convClassName.equals(“java.sql.Timestamp”)) {
Date date = toSqlDate (objet (String));
return new Timestamp(date.getTime());
} sinon if (convClassName.equals("java.lang.Integer")
|| convClassName.equals("int")) {
// Si str est un littéral shell, définissez la valeur initiale sur « 0 »
String str = (String) objet ;
si (isExist(str)) {
BigDecimal big = new BigDecimal(str);
return new Integer(big.intValue());
} autre {
renvoie un nouvel entier (0);
}
} else if (convClassName.equals("boolean")) {
return Boolean.valueOf(object.toString());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
String temp = ((String) object).trim();
// Si temp.length() == 0, il est prudent de le définir sur null au lieu de 0.
if (temp.length() == 0) {
renvoie null ;
} autre {
renvoie un nouveau BigDecimal(temp);
}
}
throwNoSupprt(objet, convClassName);
}
// ———————————« instance d'objet de java.sql.Date »
else if (instance d'objet de java.sql.Date) {
if (convClassName.equals("java.lang.String")) {
return toStringDate((java.sql.Date) objet, « aaaa/MM/jj »);
} sinon if (convClassName.equals("java.sql.Date")) {
renvoyer l'objet ;
} else if (convClassName.equals(“java.sql.Timestamp”)) {
return new Timestamp(((Date) object).getTime());
}
throwNoSupprt(objet, convClassName);
}
// ————————————-『instance d'objet de Timestamp』
else if (instance d'objet de Timestamp) {
long time = (objet (horodatage)).getTime();
if (convClassName.equals("java.lang.String")) {
return toStringDate (heure, "aaaa/MM/jj HH:mm:ss");
} sinon if (convClassName.equals("java.sql.Date")) {
renvoie un nouveau java.sql.Date(time);
} else if (convClassName.equals(“java.sql.Timestamp”)) {
renvoyer l'objet ;
}
throwNoSupprt(objet, convClassName);
}
// —————————————-『instance d'objet d'Integer』
else if (instance d'objet d'Integer) {
if (convClassName.equals("java.lang.Integer")
|| convClassName.equals("int")) {
renvoyer l'objet ;
} sinon if (convClassName.equals("java.lang.String")) {
return object.toString();
} sinon 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(objet, convClassName);
}
// ——————————————『instance d'objet de Long』
sinon si (instance d'objet de Long) {
if (convClassName.equals("java.lang.Long")
|| convClassName.equals("long")) {
renvoyer l'objet ;
} sinon if (convClassName.equals("java.lang.String")) {
return object.toString();
} sinon 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(objet, convClassName);
}
// —————————————-『instance d'objet de Double』
sinon si (instance d'objet de Double) {
if (convClassName.equals("java.lang.String")) {
// NUMÉRO DE COLONNE(8,0)
// Windows Oracle > BigDecimal
// Oracle UNIX > Double
BigDecimal big = new BigDecimal(((Double) object).doubleValue());
int échelle = big.scale();
si (échelle == 0) {
retourner big.toString();
} autre {
// Non pris en charge si un arrondi est requis.
throwNoSupprt(objet, convClassName);
}
}
if (convClassName.equals("java.lang.Integer")
|| convClassName.equals("int")) {
return new Integer(((Double) object).intValue());
} sinon 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(objet, convClassName);
}
// ————————————« instance d'objet de BigDecimal »
else if (instance d'objet de BigDecimal) {
if (convClassName.equals("java.lang.String")) {
return object.toString();
} sinon if (convClassName.equals("java.lang.Long")
|| convClassName.equals("long")) {
return new Long(((BigDecimal) object).longValue());
} sinon if (convClassName.equals("java.lang.Integer")
|| convClassName.equals("int")) {
return new Integer(((BigDecimal) object).intValue());
}
throwNoSupprt(objet, convClassName);
}
// —————————————-『instance d'objet d'octet[]』
sinon si (objet instanceof byte[]) {
if (convClassName.equals("java.sql.Blob")) {
renvoyer l'objet ;
}
throwNoSupprt(objet, convClassName);
}
// ————————————————« l'objet est booléen »
else if (instance d'objet de Boolean) {
if (convClassName.equals("boolean")) {
renvoyer l'objet ;
}
throwNoSupprt(objet, convClassName);
}
// ———————————————-『l'objet est booléen[]』
else if (instance d'objet de boolean[]) {
if (convClassName.equals("java.lang.String")) {
boolean[] bs = (boolean[]) objet ;
StringBufferbuff = new StringBuffer("[");
pour (int i = 0; i < bs.length; i++) {
buff.append(bs[i] + « »);
}
buff.deleteCharAt(buff.length() – 1);
buff.append("]");
return buff.toString();
}
throwNoSupprt(objet, convClassName);
}
throwNoSupprt(objet, convClassName);
renvoie null ;
}
/**
*Lance si la conversion n'est pas prise en charge.
*
* @param object Objet à convertir
* @param convClassName Type à convertir
*/
private static void throwNoSupprt (objet Object, String convClassName) {
String className = (object != null) ? object.getClass().getName()
: "nul";
String errorMess = "\nLe traitement de conversion de type pour cet objet n'est pas encore pris en charge.\n"
+ ” [ Objet ] = ” + objet + “,[ Type d’objet ] = ” + nom de classe
+ « ,[ convertClass ] = » + convClassName + « » ;
lancer une nouvelle UnsupportedOperationException (errorMess);
}
/**
* Convertit le caractère à la position [index] de la chaîne [str] en majuscule ou minuscule.
* <p>
* @param str Chaîne à évaluer
* @param index Position spécifiée
* @param toCase Convertir en majuscules ⇒ U | u Convertir en minuscules ⇒ L | l
* @return String après conversion
*/
chaîne statique privée convString (String str, int index, String toCase) {
if (str == null || str.trim().length() == 0) {
return str;
} autre {
String temp = str.substring(index, index + 1);
if (toCase.equalsIgnoreCase("u")) {
temp = temp.toUpperCase();
} autre {
temp = temp.toLowerCase();
}
StringBuffer tempBuffer = new StringBuffer(str);
tempBuffer.replace(index, index + 1, temp);
return tempBuffer.toString();
}
}
/**
* Vérifiez si [valeur] est une valeur valide.
*
* @param value Chaîne à évaluer
* @return [true] : Si non nul et non " »
*/
isExist booléen statique privé (valeur de chaîne) {
if (value != null && value.length() != 0) {
renvoie vrai ;
}
renvoie faux ;
}
/**
* Classe java.util.Date ou sa sous-classe au format spécifié
* Convertir en chaîne.
* @param date classe java.util.Date à convertir
* Format spécifié par le modèle @param
* Chaîne de date au format @return
*/
chaîne statique privée toStringDate (Date date, modèle de chaîne) {
SimpleDateFormat sdFormat = new SimpleDateFormat(motif);
return sdFormat.format(date);
}
java.sql.Date statique privé toSqlDate (String strDate) {
Calendrier cal = toCalendar(strDate);
retourner àSqlDate(cal);
}
java.sql.Date statique privé toSqlDate (calendrier) {
long l = cal.getTime().getTime();
renvoie un nouveau java.sql.Date(l);
}
/**
* Convertit une valeur de temps longue en chaîne au format spécifié.
* @param time Une valeur longue représentant les millisecondes de l'heure actuelle.
* Format spécifié par le modèle @param
* Chaîne de date au format @return
*/
chaîne statique privée toStringDate (longtemps, modèle de chaîne) {
return toStringDate (nouvelle date (heure), modèle);
}
/**
* Chaîne ⇒ java.sql.Date
*
* Convertissez la chaîne de date suivante en java.sql.Date
* aaaa/MM/jj HH:mm:ss.SSS aaaa-MM-jj 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
* @retour
*/
Calendrier statique privé toCalendar (String strDate) {
strDate = format(strDate);
Calendrier cal = Calendrier.getInstance();
int aaaa = 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 (aaaa, MM – 1, jj);
int len = strDate.length();
commutateur (len) {
cas 10 :
casser;
cas 16 : // aaaa/MM/jj 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(Calendrier.MINUTE, mm);
casser;
cas 19 : // aaaa/MM/jj 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(Calendrier.MINUTE, mm);
cal.set(Calendrier.SECOND, ss);
casser;
cas 23 : // aaaa/MM/jj 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(Calendrier.MINUTE, mm);
cal.set(Calendrier.SECOND, ss);
cal.set(Calendar.MILLISECOND, SSS);
casser;
défaut:
lancer une nouvelle IllegalStateException (
« Cette chaîne de chaîne ne peut pas être convertie en chaîne de date : »
+strDate);
}
retour cal ;
}
/**
* Toute chaîne de date telle que « aaaa/MM/jj » ou « aaaa/MM/jj HH:mm:ss »
* Tente de convertir au format.
* Exemple : 01/03 ⇒ 03/01/2003
* @param strDate
* @retour
*/
format de chaîne statique privé (String strDate) {
strDate = strDate.trim();
Chaîne aaaa = null ;
Chaîne MM = nul ;
Chaîne dd = null ;
Chaîne HH = nulle ;
Chaîne mm = nul ;
Chaîne ss = null ;
Chaîne SSS = nul ;
// S'il manque "-" ou "/"
if (strDate.indexOf(“/”) == -1 && strDate.indexOf(“-“) == -1) {
si (strDate.length() == 8) {
aaaa = strDate.substring(0, 4);
MM = strDate.substring(4, 6);
jj = strDate.substring(6, 8);
retourner aaaa + «/» + MM + «/» + jj ;
} autre {
aaaa = strDate.substring(0, 4);
MM = strDate.substring(4, 6);
jj = strDate.substring(6, 8);
HH = strDate.substring(9, 11);
mm = strDate.substring(12, 14);
ss = strDate.substring(15, 17);
retourner aaaa + « / » + MM + « / » + jj + « » + HH + « : » + mm + « : »
+ss;
}
}
Jeton StringTokenizer = new StringTokenizer(strDate, « _/-:. « );
Résultat StringBuffer = new StringBuffer();
pour (int i = 0; token.hasMoreTokens(); i++) {
String temp = token.nextToken();
commutateur (i) {
cas 0:// année partie
aaaa = fillString(strDate, temp, "f", "20", 4);
result.append (aaaa);
casser;
cas 1:// partie du mois
MM = fillString(strDate, temp, "f", "0", 2);
result.append("/" + MM);
casser;
cas 2:// partie journée
dd = fillString(strDate, temp, "f", "0", 2);
result.append("/" + dd);
casser;
cas 3:// temps partiel
HH = fillString(strDate, temp, "f", "0", 2);
result.append(" " + HH);
casser;
cas 4:// partie minute
mm = fillString(strDate, temp, "f", "0", 2);
result.append(“:” + mm);
casser;
cas 5:// deuxième partie
ss = fillString(strDate, temp, "f", "0", 2);
result.append(“:” + ss);
casser;
cas 6:// partie milliseconde
SSS = fillString(strDate, temp, "b", "0", 3);
result.append("." + SSS);
casser;
}
}
return result.toString();
}
chaîne statique privée fillString (String strDate, String str,
Position de la chaîne, String addStr, int len) {
si (str.length() > len) {
String mes = strDate + « Cette chaîne String ne peut pas être convertie en chaîne de date » ;
lancer une nouvelle IllegalStateException(mes);
}
return fillString(str, position, addStr, len);
}
/**
* Ajoutez la chaîne [addStr] à ajouter à la chaîne [str] à [position] dans [len]
* Insérez jusqu'à ce qu'il soit plein.
* <p>
* Exemple : String ss = StringUtil.fillString("aaa", "b", "0″,7); ss ⇒ "aaa0000"
*
* *fillString() s'insère jusqu'à ce que len soit rempli, mais addString() insère len.
*
* @param str chaîne cible
* @param position Insérer avant ⇒ F/f Insérer après ⇒ B/b
* @param addStr Chaîne à insérer
* @param len Nombre de chiffres à reconstituer
* @return La chaîne après conversion. [str] est nul ou un littéral vide, [addStr] est défini sur [len]
* Renvoie les résultats insérés jusqu'à ce qu'ils soient satisfaits.
*/
chaîne statique privée fillString (String str, position de la chaîne,
Chaîne addStr, int len) {
StringBuffer tempBuffer = null ;
si (!isExist(str)) {
tempBuffer = nouveau StringBuffer();
pour (int je = 0; je < len; i++) {
tempBuffer.append(addStr);
}
return tempBuffer.toString();
} sinon if (str.length() != len) {
tempBuffer = nouveau StringBuffer(str);
while (len > tempBuffer.length()) {
if (position.equalsIgnoreCase("f")) {
tempBuffer.insert(0, addStr);
} autre {
tempBuffer.append(addStr);
}
}
return tempBuffer.toString();
}
return str;
}
}