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