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;
    }

}

这是我的自定义类加载器。SomeClass 由这个类加载器和 tes.Test1 加载。但我看到错误: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 回答