English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
最近工作中遇到一个这样的问题:
为某个项目中的所有接口做一个测试工具,使用java Swing技术,该项目有不同的版本,不是所有版本中的接口都是相同的,而我做的工具需要兼容所有版本。
于是就引入了这样一个问题:
有些接口如果在部分版本中不存在,那么通过界面执行这个操作的时候就会报错,所以为了兼容所有版本,就要在方法调用之前考虑方法是否存在,同时为了不在编译时抛异常,在调用方法时
也需要通过反射来调用,具体实现如下:
一、使用反射判断方法是否存在
/** * Check if the method exists * * @param obj JObjectService实例 * @param methodName 方法名称 * @param paraTypes 方法形参类型数组 * @return */ public static boolean judgeMethodIsExist(Object obj, String methodName, Class[] paraTypes) { boolean result = true; try { if (null != obj) { Method method = obj.getClass().getMethod(methodName, paraTypes); } } catch (NoSuchMethodException ex) { showWarnInfo(ex.toString()); log.error("Exception survenue à :" + MainJFrame.hostName + "; Détails :" + ex.getMessage()); result = false; } return result; }
Parameter description:
(1)obj:object representing the method to be called
(2)methodName:name of the method to be called
(3)paraTypes:required parameter types for the method (array when multiple)
Through this method, you can determine whether the method methodName (parameter type is) called through the obj object exists. If it does not exist, it will throw a NoSuchMethodException exception
Secondly, invoke the method via reflection to avoid compilation-time exceptions
sysUser = MainJFrame.getSysUser(); Class[] paramObj = {String.class, long.class, String.class, String.class, int.class}; //Check if the method exists boolean isExist = CommonUtil.judgeMethodIsExist(sysUser, "createBucket", paramObj); if (isExist) { try { //Invoke method via reflection Class clazz = sysUser.getClass(); //Method name--Type of parameters in the method (in order of parameters) Method createBucket = clazz.getDeclaredMethod("createBucket", String.class, long.class, String.class, String.class, int.class); int create = (int) createBucket.invoke(sysUser, bucketName, Long.parseLong(bucketSize), bucketLoc, bucketAcl, Integer.parseInt(StringUtil.emptyToZero(bucketCycle))); if (create == 1) { CommonUtil.showInfo("Bucket creation successful"); log.info("Bucket creation successful"); } else { CommonUtil.showWarnInfo("Bucket creation failed, internal server error!"); log.info("Bucket creation failed, internal server error"); } catch (Exception ex) { CommonUtil.showWarnInfo(ex.getMessage()); log.error("Exception survenue à :" + MainJFrame.hostName + "; Détails :" + ex.getMessage()); } }
Dans le code suivant :
Ligne une : l'objet appelant la méthode createBucket est sysUser
Ligne deux : le tableau de types de paramètres dans la méthode est utilisé pour juger de l'existence de la méthode
Ligne trois : jugement de l'existence de la méthode à travers l'objet, le nom de la méthode et le tableau de types de paramètres
Par ces trois lignes, si la méthode existe, elle exécutera les tâches suivantes, et s'il n'existe pas, elle affichera un message d'exception
Ligne six : obtention de la classe de l'objet
Ligne sept : obtention de l'objet Method pour obtenir la méthode, les paramètres sont le nom de la méthode et le type des paramètres correspondants
Ligne huit : appel de la méthode createBucket via l'objet Method, les paramètres sont l'objet sysUser et les paramètres (valeurs) nécessaires
Grâce à ces méthodes, même si une interface n'existe pas dans l'objet, il n'y aura pas d'exception de compilation.
En vérité, c'est la première fois que je rencontre un problème de réflexion Java dans mon propre projet, il est nécessaire de l'enregistrer !
Résumé
Voici tous les contenus de cet article sur les notes d'application pratique de la réflexion Java, j'espère qu'ils vous seront utiles. Les amis intéressés peuvent continuer à consulter notre site :
Tutoriel simple de réflexion Java
Les choses que vous devez savoir sur le mécanisme de réflexion Java
Bienvenue pour laisser des commentaires si vous trouvez des insuffisances. Merci d'appuyer sur ce site !
Déclaration : Le contenu de cet article est issu du réseau, propriété des auteurs respectifs, contribué et téléversé par les utilisateurs d'Internet. Ce site n'en possède pas la propriété, n'a pas été édité par l'homme, et n'assume aucune responsabilité juridique. Si vous trouvez du contenu suspect de violation de droits d'auteur, vous êtes invités à envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois confirmée, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)