葫芦仔 2011-01-04 18:33
浏览 492
已采纳

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条回答 默认 最新

  • beneo 2011-01-05 12:49
    关注

    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也有父类,但是没有问题

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器