2009-08-31 10 views
1

私は(擬似コード)のような何かをできるようにしたいと思います:クラスがJavaで利用可能かどうかを検出することは可能ですか?

if (classAvailable) { 
    // do a thing 
} else { 
    // do a different thing 
} 

それが利用可能かClassBのだならば、それはない場合、私は、にClassAからクラスを拡張することができればであっても良いだろう何。私はこれが可能ではないと思う。私は動的にあなたが直接バイトコードを操作できるプログラムを作った場合を除き、1クラスまたは別を延長するかどうかを選択する方法はないと思う

try { 
    Class.forName("my.ClassName"); 
    // It is available 
} 
catch (ClassNotFoundException exception) { 
    // It is not available 
} 
+1

は「利用可能」とは何を意味するかを使用しようか?リフレクションでロードしていますか? –

+0

私はAndroid用のライブラリを作成しています。 Android 1.5以降、AsyncTaskと呼ばれるクラスがあります。これは、使用可能な場合に使用したいものです。そうでなければ、同じことをする非ネイティブクラスを使用できるようにしたいと考えています。私はそれが(おそらく)維持されるので、ネイティブなものを好むと思います。 –

答えて

1

(シンプル:

6

あなたは最初の部分を行うことができます例:コンパイルされたバイトコードを両方のバージョンのサブクラスで文字列として保持し、使用可能なスーパークラスに対応するものをロードするにはClassLoaderを使用します)。

これまで;-)

+0

まだ静的に参照しようとすると助けになりません... –

+1

コンパイル時にクラスが利用できない場合、静的な 'my.ClassName'参照はコンパイルに失敗します。クラスが利用可能であるかもしれないし、そうでないかもしれないなら、それは無駄だ。 –

2

私のいつものアプローチですがあなたは、Pythonでそれを行うことができます:

異なるソースディレクトリの中に、オプションのライブラリを使用するコードを分離します。インターフェイスを実装する必要があり、一般的にメインソースディレクトリに依存します。

ビルドの依存関係を強制するには、オプションのライブラリなしでメインソースディレクトリをコンパイルし、オプションのライブラリに依存するソースをコンパイルします(他のソースディレクトリの別のクラスファイルとコンパイラクラスパス上のライブラリ) 。

メインソースを動的に任意のソースディレクトリ(Class.forNameasSubclassgetConstructornewInstance)に単一のルートクラスをロードするように試みるべきです。ルートクラスのstatic intialiserは、ライブラリが実際に利用可能であることをチェックし、そうでない場合は例外をスローする必要があります。ルートクラスの読み込みに失敗した場合は、おそらくNullオブジェクトパターンに従います。あなたが春を使用している場合は

0

、org.springframework.util.ClassUtils#isPresent

関連する問題