ジャバ:Java 1.5 と 1.6 の両方のコードをパッケージ化する最も簡単な方法

StackOverflow https://stackoverflow.com/questions/2448614

  •  20-09-2019
  •  | 
  •  

質問

絶対にそれを実現するコードをパッケージ化したいと考えています。 しなければならない Java 1.5上で動作します。VM が 1.6 VM の場合、プログラムを「拡張」できるコードの部分が 1 つあります。

基本的には次の方法です。

 private long[] findDeadlockedThreads() {
    // JDK 1.5 only supports the findMonitorDeadlockedThreads()
    // method, so you need to comment out the following three lines
    if (mbean.isSynchronizerUsageSupported())
      return mbean.findDeadlockedThreads();
    else
      return mbean.findMonitorDeadlockedThreads();
  }

これを実現する最も簡単な方法は何でしょうか コンパイル 1.5でもまだ 1.6 の場合は 1.6 メソッド呼び出しを実行します ?

以前、私は独自の 1.6 クラスをコンパイルして、アプリと一緒にパッケージ化し、1.6 の場合に ClassLoader を使用してインスタンス化することで同様のことを行いました (1.6 JVM は 0x32 クラスと 0x31 クラスを混在させてもまったく問題ないため)。ちょっとやりすぎです (ビルドプロセス中に 0x31 と 0x32 の両方の .class ファイルをビルドする必要があるため、少し面倒です)。

上記のメソッドを 1.5 でコンパイルしたい場合はどうすればよいですか?おそらくリフレクションを使用するかもしれませんが、その後はどうすればよいですか(リフレクションについてはまったく詳しくありません)

注記:興味があれば、上記の方法はこの記事から引用しています。 http://www.javaspecialists.eu/archive/Issue130.html

(ただし、記事のように「3 行をコメントする」ことはしたくありません。これを 1.5 と 1.6 の両方でコンパイルして実行できるようにしたいのです)

役に立ちましたか?

解決

これを 1.5 でコンパイルすることはできませんが、target-option を 1.5 に設定して (1.5 のバイトコードを生成する)、1.6 でコンパイルし、コード内でリフレクションを使用してメソッドが使用可能かどうかを確認することができます。

このコードはメソッドを検索します。mbean.getClass().getMethod("findDeadlockedThreads", new Class[0]);問題は、メソッドが存在しない場合、単に null または同様のものを返すのではなく、NoSuchMethodException をスローすることです。つまり、次のようなコードが必要になります。

try
{
  mbean.getClass().getMethod("findDeadlockedThreads", new Class<?>[0]);
  return mbean.findDeadlockedThreads();
}
catch(NoSuchMethodException ex)
{
  return mbean.findMonitorDeadlockedThreads();
}

これは、決定を行うために例外を使用するため、あまり良いものではありません。それはおそらくあまり速くありません。代わりに getMethods を使用し、メソッドが使用可能な場合は返されたリストを反復処理することもできます。それもあまり速くありません。

編集: Christopher Oezbek はコメントで、Try-catch ブロックのオーバーヘッドを避けるために、メソッドの存在のチェックを 1 回だけ実行し、結果を保存することを提案しています。それは正しいことであり、良い解決策です。matt b は、使用されているクラスとメソッドが Java 1.5 で使用できるかどうか、Java コンパイラの target-option がチェックしないことを警告します。その通りです (そして、1.6 メソッドに対してコンパイルしたいので、そうしないと機能しません)。つまり、この問題を回避するには、プログラムを 1.5 VM で注意深くテストする必要があることを意味します。お二人ともコメントありがとうございます。

他のヒント

1.5用にコンパイルします。

あなたのコード使用反射で。あなたはクラスのインタフェースからメソッドオブジェクトを取得することができます。それは、パラメータとして、あなたのMBeanインスタンスを取るinvokeメソッドを持っています。このような何かます:

クラスC = mbean.getClass()。 //また、これを取得するYourClass.classを行うことができます。

メソッドm = c.getMethod( "findMonitorDeadLockedThreads")。 //または任意の他の方法(パラメータ この方法は、クラス... getMethodの2番目のパラメータで指定されている)。

m.invoke(MBeanの)//インスタンスでメソッドを呼び出します。

もちろん、あなたは、このすべての時間を行う必要はありません。セットアップコンストラクタのメソッド参照して、ちょうどオンデマンドで右のいずれかを呼び出します。

Mavenは、あなたがプロファイルとかなり簡単にこれを行うことができます。プロファイルの背後にある考え方は、あなたが物事いくつかの基準に基づいて何かの2つの異なるバージョンを構築したいということです。この具体例では、あなたは、jdk15jdk16プロファイルを定義し、それぞれをコンパイルしているJDKのバージョンを指定して、jdk16でjdk15プロファイルおよび他の中のクラスの一つのコピーが含まれるように、それを伝えることができます。

開始するには、参照してください。

のhttp://unserializableone.blogspot .COM / 2008/09 /コンパイル・アンド・テストと、異なる-jdk.html

この問題の別のバージョンのJDKの一部を行う方法について説明します。

JDKのバージョンに応じて、クラスの異なる定義を使用して、問題の第二の部分を処理するために、これを参照してください。

のMaven - ビルド時

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top