1

複数のビルドを持たなくても、Java ME の複数のバージョンをサポートできるようにしたいと考えています。プロファイル/構成/サポートされている JSR を検出する方法は既に知っています。私の問題は、JSR が実行時にサポートされているかどうかを知っていても、Java-ME がリフレクションをサポートしていないため、すべての機能を使用できないことです。

新しいバージョンで追加された関数をコード内の任意の場所 (決して実行されない場所であっても) 呼び出すと、一部の JVM で解決中にエラーが発生する可能性があります。これを回避する方法はありますか?

関連する質問

4

1 に答える 1

1

Cアクセスできることがわかっているインターフェイスを介してクラスにアクセスするだけでよい場合は、次のように簡単です。

MyInterface provider=null;
try{
    Class myClass= Class.forName("sysPackage.C");
    provider = (MyInterface)(myClass.newInstance());  
}catch(Exception ex){
}
if(provide!=null){
    //Use provider
}

C使用できるインターフェイスがない場合はS、代わりにインターフェイスのメンバーになるラッパー クラスを作成できます。

class S implements MyInterface{
    static {
        try {
            Class.forName("sysPackage.C");
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    } 
    public static void forceExceptionIfUnavailable() {}
    //TODO: Methods that use C. Class C will only be used within this class
}   

Sが利用できない場合、クラスの解決中に例外がスローされるように、静的ブロックがありますC。クラスをロードした直後にforceExceptionIfUnavailable、静的ブロックがすぐに実行されることを確認するために呼び出します。クラッシュしない場合は、のメソッドを使用しSて間接的に class を使用できますC

または、ここでメソッドを使用できます。

基本的に、新しいパッケージを作成Pし、パブリック抽象クラスと、パッケージに対してプライベートAな具象サブクラスを作成します。インスタンス化中に例外がスローされた場合に、またはのインスタンスを返す静的メソッドがあります。の各インスタンスには のインスタンスがあるため、 が利用できない場合はインスタンス化に失敗しますが、それ以外の場合は成功します。この方法は(したがってすべてのAPI が) パッケージ プライベートであるため、少し安全なようです。SAgetSSnullSCCSC

于 2010-03-15T00:57:29.160 に答える