0

重複の可能性:
カスタム クラス ローダーを使用したリソース バンドルの読み込み

Web サイトから jar をダウンロードして実行するカスタム クラス ローダーを作成しました。問題は: 私の (ダウンロードした) jar には、png 画像などのリソースが必要です...

(ダウンロードした) jar をコマンド プロンプトで直接実行すると、機能します。リソースは次のようにロードされます。

getClass().getResource("/images/logo.png")

ここで、カスタム クラス ローダーで実行すると、次のようになります。

Class<?> c = classLoader.loadClass("MainClass");
c.getMethod("main", new Class[] { java.lang.String[].class}).invoke(null, new Object[]{new String[] {"arg1_goes_here"}});

リソースを読み込めないため、null 例外が発生します。

jar ファイルをメモリにロードするときは、次のようにします。

String name = entry.getName();
if(name.endsWith(".class")) {
    name = name.substring(0, name.length() - 6).replace('/', '.');
    classbytes = getResourceData(input);
    classes.put(name, classbytes);
} else {
    classbytes = getResourceData(input);
    if (name.charAt(0) != '/') {
        name = "/" + name;
    }
    resources.put(name, classbytes);
}

次を使用してクラスをロードしています:

defineClass(classToLoad, buffer, 0, buffer.length, null);

buffer、コードを含むバイト配列です。

だから私の質問は次のとおりです。Javaには一種のdefineResource()がありますか?

ありがとう。

4

1 に答える 1

2

問題が解決しました、

私は自分のメソッドを書きましたpublic InputStream getResourceAsStream(String name)

コードは次のとおりです。

public InputStream getResourceAsStream(String name)
{
    byte[] buffer = resources.get(name);
    return new ByteArrayInputStream(buffer);
}

resources私のリソースデータを含むマップです。

次に、私のコードでは、inputstream を使用してリソースを取得できます。簡単で安全。

于 2012-06-26T21:18:02.203 に答える