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("La excepción ocurrió en:") + MainJFrame.hostName + "; Detalles: " + ex.getMessage()); result = false; } return result; }
Parameter description:
(1)obj:object representing the method to be called
(2)methodName:method name to be called
(3)paraTypes:method required parameter types (array when multiple)
Through this method, you can determine if the methodName (parameter type is) method called through the obj object exists. If it does not exist, it will throw a NoSuchMethodException exception
Secondly, invoke the method through reflection to avoid compile-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 through reflection Class clazz = sysUser.getClass(); //Method name--Parameter types of 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("La excepción ocurrió en:") + MainJFrame.hostName + "; Detalles: " + ex.getMessage()); } }
En el código anterior:
La primera línea: el objeto que llama al método createBucket es sysUser
La segunda línea: el array de tipos de parámetros en el método se utiliza para determinar si el método existe
La tercera línea: mediante el objeto, el nombre del método y el array de tipos de parámetros, se determina si el método existe
A través de las tres líneas anteriores, si el método existe, se ejecutará la tarea siguiente, y si no existe, se mostrará un mensaje de excepción
La sexta línea: obtener la Class del objeto
La séptima línea: obtener el objeto Method del método, los parámetros son el nombre del método y el tipo correspondiente de los parámetros
La octava línea: invocar el método createBucket a través del objeto Method, los parámetros son el objeto sysUser y los parámetros necesarios (valores)
A través de los métodos anteriores, ni siquiera se producirá una excepción de tiempo de compilación si no existe alguna interfaz en el objeto.
En serio, es la primera vez que me he encontrado con problemas de reflexión de Java en mi proyecto, es necesario que lo registre!
Resumen
Esto es todo el contenido del artículo sobre la aplicación práctica de la reflexión de Java, espero que sea útil para todos. Los amigos interesados pueden continuar consultando nuestro sitio:
Tutorial简易 de Reflexión de Java
Cosas que necesitas saber sobre el mecanismo de reflexión de Java
¡Bienvenidos a dejar comentarios sobre deficiencias. ¡Gracias a todos los amigos por su apoyo a este sitio!
Declaración: El contenido de este artículo se obtiene de la red, pertenece al propietario original, el contenido se contribuye y carga espontáneamente por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha procesado editorialmente por humanos y no asume la responsabilidad legal relevante. Si encuentra contenido sospechoso de infracción de derechos de autor, bienvenida la envío de un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para realizar una denuncia y proporcionar evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.