Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字节码到类_Java_Transform_Bytecode - Fatal编程技术网

Java字节码到类

Java字节码到类,java,transform,bytecode,Java,Transform,Bytecode,我从网络上获取字节码。我将字节数组转换为类 package l2soft.utils; public final class CustomClassLoader extends ClassLoader { public static CustomClassLoader _instance; public static CustomClassLoader getInstance() { return _instance; } public void defineCustomClass

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

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

}
(使用接收类编译)

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

UPD:

包l2soft.utils;
导入java.util.HashMap;
导入java.util.Map;
公共最终类CustomClassLoader扩展了ClassLoader{
私人地图>();
}
public void defineCustomClass(字节[]字节码){
clazz类=定义类(null,字节码,0,字节码.length);
课堂(clazz);
cache.put(clazz.getName(),clazz);
}
@凌驾
公共同步类findClass(字符串名称)引发ClassNotFoundException{
类结果=cache.get(名称);
如果(结果==null)
super.findClass(名称);
返回结果;
}
}

这是我的自定义类加载器。通过这个类加载器和tes.Test1加载SomeClass。但我看到了错误:import test.Test1无法解析。此CustomClassLoader设置为默认加载器(-Djava system.loader=l2soft.utils.CustomClassLoader)

由于您没有在问题中指定,我假设您正在名为
SomeClass
的类中导入
test.Test1
。我还假设在运行JVM时,该类位于初始类路径中(这似乎是问题的本质所暗示的)

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

问题是,由于类路径上没有
test.Test1
,默认类装入器无法解决它,因此出现错误<代码>测试。只有使用自定义加载程序手动加载Test1之后,Test1才能解析,这发生在从类路径加载初始类之后(当JVM实际运行应用程序时)


这可能不是一件容易解决的事情。可能最简单的方法是进行
测试。Test1
实现一些接口(比如
测试
),该接口位于类路径上。那么,在
SomeClass
中,您可以导入
Test
并使用
Test
引用而不是
Test。Test1
引用引用动态加载的类的对象。

您是下载所有必需的类还是只下载一个?
-verbose:class
是您的朋友遇到了麻烦。SomeClass在测试后加载。Test1班级。我尝试将我的CustomClassLoader用作系统(-Djava.system.loader)并用缓存覆盖findClass,但结果没有改变。如您所说,如果在加载
test.Test1
之后加载了
SomeClass
,那么可能是
test.Test1
没有正确加载,或者加载
SomeClass
的加载程序与加载
test.Test1
的加载程序不同,并且不是它的后代(因此,
test.Test1
被加载,但不在类层次结构
SomeClass
中有权访问)。另外,我认为这是
-Djava.system.class.loader
,而不是
-Djava.system.loader
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;
    }

}