葫芦仔 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 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题