NutzCN Logo
问答 自定义classloader在test中可以运行,web环境无法运行
发布于 1792天前 作者 qq_64f81159 1219 次浏览 复制 上一个帖子 下一个帖子
标签:

要实现一个功能,模板上传,模板对应一个模板解析类,这个解析类我准备放到数据库中,然后从数据库中加载这个解析类,自定义classloader是这样的

public class StringClassLoader extends ClassLoader {
	private String classStr;
	
	public StringClassLoader(String classStr) {
		super();
		this.classStr = classStr;
	}
	
	@Override
	protected Class<?> findClass(String name) throws ClassNotFoundException {
		Class<?> clazz = null;// this.findLoadedClass(name); // 父类已加载
		// if (clazz == null) { //检查该类是否已被加载过
		byte[] classData = classStr.getBytes(); // 根据类的二进制名称,获得该class文件的字节码数组
		if (classData == null) {
			throw new ClassNotFoundException();
		}
		clazz = defineClass(name, classData, 0, classData.length); // 将class的字节码数组转换成Class类的实例
		// }
		return clazz;
	}
}

然后写了一个测试方法

String str = Files.read("d:\\Model4Analysis.class");
		System.out.println(str);
		StringClassLoader classLoader = new StringClassLoader(str);
		
		Class<?> clazz = (Class<?>) classLoader.loadClass("com.kanq.model.analysis.Model4Analysis");
		Mirror.me(clazz).invoke(Mirror.me(clazz).born(), "a");

我把这个代码直接在测试类中跑的时候可以反射a方法,把这个部署到tomcat中的时候就报错

java.lang.ClassFormatError: Incompatible magic value 4022320623 in class file 

这个是什么原因,我设置的myeclipse的jdk版本和 tomcat jdk是一致的。

5 回复

用byte[],别用String,class

Files.read读文件的编码默认是jdk环境的编码,windows下默认是gbk的,-Dfile.encoding=utf-8可以调整

但,别用String才是正路

但是这个我这个class其实是存在于数据库中的,我必须要用String啊 ,难道我能从数据库读取一个byte[]吗。。另外这个class如果依赖了其他的jar包是不是也不行,

不小心发出去了,我用字节流改了以后报错是

java.lang.NoClassDefFoundError: org/nutz/lang/util/NutMap

这个是因为我方法的参数用到了NutMap。

构建StringClassLoader的时候,要传父classloader

参考nutz里面aop实现吧

添加回复
请先登陆
回到顶部