要实现一个功能,模板上传,模板对应一个模板解析类,这个解析类我准备放到数据库中,然后从数据库中加载这个解析类,自定义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是一致的。