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

Javaリフレクションの実際の業務での適用のノート

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

为某个项目中的所有接口做一个测试工具,使用java Swing技术,该项目有不同的版本,不是所有版本中的接口都是相同的,而我做的工具需要兼容所有版本。

于是就引入了这样一个问题:

有些接口如果在部分版本中不存在,那么通过界面执行这个操作的时候就会报错,所以为了兼容所有版本,就要在方法调用之前考虑方法是否存在,同时为了不在编译时抛异常,在调用方法时

也需要通过反射来调用,具体实现如下:

一、使用反射判断方法是否存在

/**
   * メソッドが存在するかどうかを判断する
   *
   * @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("例外が発生した場所:" + MainJFrame.hostName + ";詳細情報は:" + ex.getMessage());
      result = false;
    }
    return result;
  }

パラメータの説明:

(1)obj:呼び出すメソッドのオブジェクト

(2)methodName:呼び出すメソッドの名前

(3)paraTypes:メソッドが必要とする引数のタイプ(複数の場合は配列)

このメソッドを使用すると、objオブジェクトを通じて呼び出すmethodName(引数のタイプが)メソッドが存在するかどうかを判断できます。存在しない場合、NoSuchMethodExceptionが発生します

二、反射を使用してメソッドを呼び出すことで、コンパイル時の例外を避ける

sysUser = MainJFrame.getSysUser();
    Class[] paramObj = {String.class, long.class, String.class, String.class, int.class};       //メソッドが存在するかどうかを判断する
    boolean isExist = CommonUtil.judgeMethodIsExist(sysUser, "createBucket", paramObj);
    if (isExist) {
      try {            //反射を使用してメソッドを呼び出す
        Class clazz = sysUser.getClass();            //メソッド名--メソッドの引数のタイプ(引数の順序で)
        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作成成功");
          log.info("Bucket作成成功");
        } else {
          CommonUtil.showWarnInfo("Bucket作成失敗、サーバー内部エラー!");
          log.info("Bucket作成失敗、サーバー内部エラー");
        }
      catch (Exception ex) {
        CommonUtil.showWarnInfo(ex.getMessage());
        log.error("例外が発生した場所:" + MainJFrame.hostName + ";詳細情報は:" + ex.getMessage());
      }
    }

上記のコードでは:

第一行:createBucketメソッドを呼び出すために使用されるsysUserオブジェクト

第二行:メソッド内の引数のタイプの配列は、メソッドが存在するかどうかを判断する際に使用されます。

第三行:オブジェクト、メソッド名、引数のタイプの配列を通じてメソッドが存在するかどうかを判断します。

上記の三行により、メソッドが存在する場合には以下のタスクを実行し、存在しない場合には例外情報を表示します。

第六行:そのオブジェクトのClassを取得します。

第七行:Methodオブジェクトを取得する方法、引数はメソッド名と引数の対応するタイプです。

第八行:Methodオブジェクトを通じてcreateBucketメソッドを反射的に呼び出し、引数はsysUserオブジェクトと必要な引数(値)です。

上記の方法により、オブジェクト内にインターフェースが存在しない場合でも、コンパイル時の例外が発生しません。

正直に言えば、これは自分のプロジェクトで初めてJava反射の問題に直面しました。必要な情報を記録しておく必要があります。

まとめ

これで、本文におけるJava反射の実際の業務での適用に関するノートのすべてが終わりました。皆様に役立つことを願っています。興味がある場合は、本サイトを参照してください:

Java反射簡単ガイド

Java反射メカニズムについて知っておくべきこと

不十分な点があれば、コメントをいただければ幸いです。皆様の本サイトへのサポートに感謝します。

声明:本文の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、本サイトは所有権を有しておらず、人工的な編集は行われていません。著作権侵害が疑われる内容がある場合は、メールを送信していただければ幸いです:notice#oldtoolbag.com(メールを送信する際には、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、本サイトは直ちに侵害される可能性のあるコンテンツを削除します。)

おすすめ