5

Windows プラットフォームで失敗するコンパイル済みの実行可能 JAR ファイルがあります。

その理由は、特定の OS X 固有のプロパティ ( About ウィンドウなど) を適切に統合したいからです。

条件を使用してコードを具体的に封鎖しましたが、JAR はまだNoClassDefFoundError実行の最初の行でクラッシュしています。

if (isOSX()) {
    com.apple.eawt.Application application = com.apple.eawt.Application.getApplication();
    application.setAboutHandler(new com.apple.eawt.AboutHandler() {
        @Override
        public void handleAbout(com.apple.eawt.AppEvent.AboutEvent ae) {
            new AboutWindow();
        }
    });
    application.setDefaultMenuBar(MenuSystem.createMenu());
}

このコードを JAR ファイルに含めて、1 つの一貫したコードベースを作成することはできますか?

4

3 に答える 3

5

Class.forNameを使用して周囲のクラスを動的にロードしようとしましたか?

Class.forName("com.myproject.ClassContainingApple");

このようにして、1 つのクラス内ですべての Apple 固有のクラスを参照し、それをisOSX()ブランチに動的にロードできます。他の利用できないクラスを参照するクラスをロードできないため、この方法で行う必要があります。OSX を使用しているかどうかを判断してから、OSXのみのクラスを参照するものをロードする必要があります。

OS固有の要件がさらにある場合にこれを行う拡張可能な方法は、OSにちなんでクラスに名前を付け、検出されたOSに基づいてクラス名をロードすることです。たとえば、クラスWindowsExtensions、などを呼び出します (適切な名前を調べる必要があります。例を提供しているだけです)。OSXExtensionsLinuxExtensions

たとえば、使用例は次のとおりです。

String className = ""java.util.ArrayList";
Class cls = Class.forName(className);
List list = (List)cls.newInstance();
于 2012-11-15T15:40:35.663 に答える
0

クラスのインスタンス化中にクラスが使用する可能性のあるすべてのクラスをJavaがロードしているため、これは不可能です。そのため、名前付きクラスは使用できません。

OSX で実行している場合にのみ、プロジェクト内の別のクラスにコードを配置して、このクラスをインスタンス化することができます。

これが機能しない場合は、リフレクションを使用する必要があります。これは、リフレクションを介してロードしたときにのみ VM がこのクラスを検出できるためです。

HTH

于 2012-11-15T15:44:58.743 に答える