English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Notes on the application of Java reflection in actual work

最近工作中遇到一个这样的问题:

为某个项目中的所有接口做一个测试工具,使用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涉嫌侵权的内 容立即删除。)

You might also like