最近因ClassLoader 加载动态类 费了很大劲 最终高人指点解决 贴出来大家分享一下
因为加载的类中有父类和 和其它引用类 并且都初始化和使用过 问题就是因为这
这是个是自定义ClassLoad类
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
public class ClassLoad extends ClassLoader {
ClassLoad(ClassLoader parent) {
super(parent); //这个很重要解决父类用过的问题
}
private static ClassLoad instance = null;
static InputStream in = null;
public static ClassLoad getInstance(InputStream in,ClassLoader parent) {
try {
instance = new ClassLoad(parent);
ClassLoad.in = in;
} catch (Exception e) {
System.out.println(e.toString());
}
return instance;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
int n;
while ((n = in.read()) != -1) {
out.write(n);
}
byte b[]=out.toByteArray();
in.close();
Class<?> myclass = findLoadedClass("parser.YouJiuBaGuaParser");
if (myclass == null) {
myclass = defineClass(null,b, 0, b.length);
return myclass;
} else {
return myclass;
}
} catch (Exception e) {
System.out.println(e.toString());
return null;
}
}
}
下边这个是普通类在调用 in 是从数据库或从硬盘上取了的InputStream流这个abc是象征性的东西没用大家可自行修改
Class<?> c = ClassLoad.getInstance(in,this.getClass().getClassLoader()).findClass("abc");
parser.YouJiuBaGuaParser这个是我的包名还有类名
因为加载的类中有父类和 和其它引用类 并且都初始化和使用过 问题就是因为这
这是个是自定义ClassLoad类
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
public class ClassLoad extends ClassLoader {
ClassLoad(ClassLoader parent) {
super(parent); //这个很重要解决父类用过的问题
}
private static ClassLoad instance = null;
static InputStream in = null;
public static ClassLoad getInstance(InputStream in,ClassLoader parent) {
try {
instance = new ClassLoad(parent);
ClassLoad.in = in;
} catch (Exception e) {
System.out.println(e.toString());
}
return instance;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
int n;
while ((n = in.read()) != -1) {
out.write(n);
}
byte b[]=out.toByteArray();
in.close();
Class<?> myclass = findLoadedClass("parser.YouJiuBaGuaParser");
if (myclass == null) {
myclass = defineClass(null,b, 0, b.length);
return myclass;
} else {
return myclass;
}
} catch (Exception e) {
System.out.println(e.toString());
return null;
}
}
}
下边这个是普通类在调用 in 是从数据库或从硬盘上取了的InputStream流这个abc是象征性的东西没用大家可自行修改
Class<?> c = ClassLoad.getInstance(in,this.getClass().getClassLoader()).findClass("abc");
parser.YouJiuBaGuaParser这个是我的包名还有类名