Topic: 类装载时在当前执行类编译时存在,却无法再找到?? |
Print this page |
1.类装载时在当前执行类编译时存在,却无法再找到?? | Copy to clipboard |
Posted by: skyandfly Posted on: 2005-08-29 21:35 我想通过类装载器,装载一个类来运行,可是他却抛出: java.lang.NoClassDefFoundError: thread (wrong name: thread/thread) at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.lang.ClassLoader.defineClass(Unknown Source) at loader.PlayerLoader.findClass(TestLoader.java:32) at loader.TestLoader.main(TestLoader.java:53) Exception in thread "main" 装载类: class PlayerLoader extends ClassLoader{ public Class findClass(String name)throws ClassNotFoundException{ FileInputStream in = null; int length = 0; try { in = new FileInputStream("./bin/thread/" + name+".class"); length = in.available(); if(length == 0) throw new ClassNotFoundException(name); byte[] buf = new byte[length]; in.read(buf); return defineClass("thread",buf,0 ,buf.length); } catch (IOException e) { }finally{ try { if(in != null) in.close(); } catch (IOException e1){} } System.out.println("he"); return null; } } public class TestLoader { public static void main(String args[])throws InstantiationException, IllegalAccessException{ String name = "thread"; PlayerLoader loader = new PlayerLoader(); try { Class c = loader.findClass(name); System.out.println("hello"); thread t = (thread)c.newInstance(); t.start(); } catch(ClassNotFoundException e){} } } 被装载的.class文件的类如下: public class thread extends Thread{ public volatile boolean bool = true; public synchronized void put() throws InterruptedException{ while(!bool) wait(); bool = false; System.out.println(" the put !"); notifyAll(); } public synchronized String get(int i)throws InterruptedException{ while(bool) wait(); bool = true; System.out.println(" the get !"); notifyAll(); return "get"; } public void run(){ try{ put(); get(2); print(); }catch(InterruptedException e){ } } public void print()throws InterruptedException{ sleep(2000); System.out.println("the print"); } public static void main(String args[]){ new thread().start(); } } 请问这是怎么回事情?我用打印buf发现里面有数据呀! |
2.Re:类装载时在当前执行类编译时存在,却无法再找到?? [Re: skyandfly] | Copy to clipboard |
Posted by: wonderfuture Posted on: 2005-09-01 06:39 有两个问题需要注意:1.FileInputStream类的available方法并不一定返回文件长度,它的含义是当前可一次性非阻塞读取的字节数. 2.类加载器是一个工作框架,并非仅仅使用一个findClass方法就可完事大吉,还需要使用loadClass方法,你可以仔细查看Api文档 |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |