葫芦仔 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条)

报告相同问题?

悬赏问题

  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题