Class<?> c=ClassLoad.findLoadedClass(?,?,?,?)
如何解决加载的二进制流创建的类中有继承类和其它使用类
因为继承类是曾被程序运程时就被初使化调用过 所以在创建 c的时候因为继承类已被创建 所以抛出异常java.lang.NoClassDefFoundError 说父类没被 找到 我后来又调整下又报InvocationTargetException这个异常
不知各位同志有何解决办法 类在main方法和junit测试中没任何问题
这个是创建类
Class<?> c=super.defineClass("bma.bricks.catchmessage.parse.parser.YouJiuBaGuaParser",bb.array(), 0, bb.capacity());
这个是bb.array()这个流的类
public class YouJiuBaGuaParser extends ICatchParser
这个是抽象类
public abstract class ICatchParser
hi, 你的find class用法有问题
你在findClass里面用了父类的方法寻找class,如果找到了,你的classloader还有什么意义呢?
[code="java"] Class<?> c = super.defineClass(null, bb.array(), 0, bb.capacity());[/code]
capacity不一定是你bb真正的结尾,你要明白。
我给你看我写的例子好了
[code="java"]
public class MyClassLoaderOne extends ClassLoader {
public static final String PATH = "/home/saarixx/IdeaProjects/q&a-javaeye/classloader-meta/target/classes/";
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
String path = PATH + name.replace(".", "/") + ".class";
Preconditions.checkArgument(new File(path).exists(), path);
FileInputStream in = null;
ByteArrayOutputStream out = null;
try {
int c;
in = new FileInputStream(path);
out = new ByteArrayOutputStream();
while ((c = in.read()) != -1) {
out.write(c);
}
return out.toByteArray();
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
return null;
}
// public String toString() {
// return String.format("classloaderOne ----\n getClass-classloader : %s\nthread-context-classloader : %s", getClass().getClassLoader(), Thread.currentThread().getContextClassLoader());
// }
}
[/code]
[quote]
Class personClazzOne = myClassLoaderOne.loadClass("com.imbeneo.classloader.demo.meta.Person");
[/quote]
我这个load的class也有父类,但是没有问题
你是不是自己重写了loadClass?
不要重写这个方法,重写findClass就好了
父类什么的没有关系,defineClass的时候就会自动帮你加载夫类
不要让你加载的文件放在你的classpath下面,要不然会通过你自定义的classloader找到就不加载了。。
你完全可以loadClassData弄成一个inputStream进去,这样你就不用path来指定了。。。