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