ClassLoad.findLoadedClass(?,?,?,?) java.lang.NoClassDefFoundError

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

3个回答

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来指定了。。。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问