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("Der Ausnahmevorgang trat auf: " + MainJFrame.hostName + "; Details: " + 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)
With this method, you can determine whether the method methodName (parameter type is) called through the obj object exists. If it does not exist, a NoSuchMethodException will be thrown
Secondly, invoke the method by 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 by 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("Der Ausnahmevorgang trat auf: " + MainJFrame.hostName + "; Details: " + ex.getMessage()); } }
Im obigen Code:
Zeile 1: Das Objekt, das den Methodenaufruf createBucket durchführt, ist sysUser
Zeile 2: Das Array der Parameterarten in der Methode wird verwendet, um zu überprüfen, ob die Methode existiert
Zeile 3: Überprüfen Sie, ob die Methode durch das Objekt, den Methodennamen und das Array der Parameterarten existiert
Durch diese drei Zeilen wird die untere Aufgabe ausgeführt, wenn die Methode vorhanden ist, und es wird eine Ausnahmemeldung angezeigt, wenn sie nicht vorhanden ist
Zeile 6: Erhalten Sie die Klasse des Objekts
Zeile 7: Erhalten Sie das Method-Objekt, um das Objekt zu erhalten, das den Methodennamen und die Typen der Parameter enthält
Zeile 8: Rufen Sie den createBucket-Methodenaufruf über das Method-Objekt reflexiv auf, die Parameter sind das sysUser-Objekt und die erforderlichen Parameter (Werte)
Durch diese Methode tritt keine Compile-Time-Exception auf, selbst wenn ein bestimmter Interface im Objekt nicht vorhanden ist.
Ehrlich gesagt, das ist das erste Mal, dass ich in einem eigenen Projekt ein Problem mit dem Java Reflection begegnet bin. Es ist notwendig, dies zu notieren!
Zusammenfassung
Das ist das Ende der Anwendungsnote von Java Reflection in diesem Artikel. Hoffentlich hilft es Ihnen weiter. Interessierte Freunde können weiterhin die Website konsultieren:
Einfache Java Reflection Anleitung
Was Sie über das Java Reflection Mechanismus wissen müssen
Wir freuen uns über jegliche Verbesserungsvorschläge. Vielen Dank für die Unterstützung unserer Freunde!
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrechtlichem Eigentümer. Der Inhalt wurde von Internetbenutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht von Hand bearbeitet. Sie übernimmt auch keine Haftung für die rechtlichen Konsequenzen. Wenn Sie urheberrechtlich geschützte Inhalte finden, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @ beim Senden einer E-Mail, um eine Beschwerde einzureichen und relevante Beweise bereitzustellen. Sobald nachgewiesen wird, dass der Inhalt urheberrechtlich geschützt ist, wird diese Website den涉嫌侵权的内 容立即删除。)