0

ネットワークからバイトコードを取得します。バイト配列をクラスに変換します

package l2soft.utils;

public final class CustomClassLoader extends ClassLoader {

public static CustomClassLoader _instance;
public static CustomClassLoader getInstance() {
    return _instance;
}

public void defineCustomClass(byte[] bytecode) {
    Class<?> clazz = defineClass(null, bytecode, 0, bytecode.length);
    resolveClass(clazz);
}

}

しかし、アプリケーションの起動時に、派生クラスが見つかりません。

The import test.Test1 cannot be resolved

(受信したクラスでコンパイル)

注:クラスファイル名がわかりません。クラスをリクエストする必要はありません。サーバー自体が送信します

更新:

package l2soft.utils;

import java.util.HashMap;
import java.util.Map;

public final class CustomClassLoader extends ClassLoader {

    private Map<String, Class<?>> cache;

    public static CustomClassLoader _instance;
    public static CustomClassLoader getInstance() {
        return _instance;
    }

    public CustomClassLoader(ClassLoader parent) {
        super(ClassLoader.getSystemClassLoader());
        _instance = this;
        cache = new HashMap<String, Class<?>>();
    }

    public void defineCustomClass(byte[] bytecode) {
        Class<?> clazz = defineClass(null, bytecode, 0, bytecode.length);
        resolveClass(clazz);
        cache.put(clazz.getName(), clazz);
    }

    @Override
    public synchronized Class<?> findClass(String name) throws ClassNotFoundException {
        Class<?> result = cache.get(name);

        if(result == null)
            super.findClass(name);

        return result;
    }

}

これは私のカスタム クラスローダーです。このクラスローダと tes.Test1 による SomeClass ロード。しかし、エラーが表示されます: import test.Test1 を解決できません。この CustomClassLoader をデフォルトのローダーとして設定 (-Djava system.loader=l2soft.utils.CustomClassLoader)

4

1 に答える 1

1

test.Test1質問で指定していないので、という名前のクラスにインポートしていると仮定しますSomeClass。また、JVM を実行するときに、このクラスが最初のクラスパスにあると仮定します (これは、問題の性質によって暗示されているようです)。

SomeClassアプリケーションが起動すると、デフォルトのクラス ローダーを使用して、クラスパス上のすべてのクラス ( を含む) がロードされます。SomeClassが適切に動作するようにするには、インポートする他のすべてのクラス ( を含むtest.Test1) もロードされていることを確認する必要があります。

問題は、クラスパスにtest.Test1 ないため、デフォルトのクラスローダーが解決できないため、エラーが発生することです。test.Test1カスタム・ローダーを使用して手動でロードするまで解決できません。これは、クラスパスからの最初のクラス・ロードの後(アプリケーションが実際にJVMによって実行されるとき)に発生します。

これはおそらく簡単に修正できるものではありません。おそらく最も簡単な方法は、クラスパスにあるtest.Test1インターフェイス (たとえばTest) を実装することです。次に、動的にロードされたクラスのオブジェクトを参照するために、参照ではなく参照をインポートして使用できます。SomeClassTestTesttest.Test1

于 2012-08-16T23:35:09.687 に答える