ネットワークからバイトコードを取得します。バイト配列をクラスに変換します
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)