繁体   English   中英

Java字节码分类

[英]Java bytecode to class

我从网络获取字节码。 我将字节数组转换为类

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

(与收到的类一起编译)

注意:我不知道类文件名。 我不需要请求一个类,服务器本身发送

UPD:

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。 但我看到错误:导入test.Test1无法解决。 此CustomClassLoader设置为默认加载器(-Djava system.loader = l2soft.utils.CustomClassLoader)

由于您未在问题中指定,因此我假设您要在名为SomeClass的类中导入test.Test1 我还假定该类在运行JVM时位于您的初始类路径中(问题的性质似乎暗示了这一点)。

当您的应用程序启动时,它将使用默认的类加载器加载类路径上的所有类(包括SomeClass )。 为了确保SomeClass可以正常运行,它还必须确保也加载了它导入的所有其他类(包括test.Test1 )。

问题是,由于test.Test1 不在类路径上,因此默认的类加载器无法解析它,因此会出现错误。 test.Test1无法解析,直到后您手动自定义加载程序,它从类路径(当应用程序实际上是由JVM上运行)的初始类负载发生加载它。

这可能不是一件容易的事情。 也许最简单的方法就是让test.Test1实现一些接口(比如Test ),这在类路径上。 然后,在SomeClass您可以导入Test并使用Test引用而不是test.Test1引用来引用动态加载的类的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM