Re: why do I get this runtime error
Aryeh M. Friedman wrote:
When I run this:
package scratch;
import java.io.*;
public class Main extends ClassLoader
{
public Main()
{
super(Main.class.getClassLoader());
}
public static void main(String[] args)
throws Throwable
{
Main m=new Main();
File f=null;
Side point: why initialize f to null? You throw away the value immediately,
so why use it at all?
f = new File("/usr/home/plos/obj/scratch/Main.class");
int size = (int)f.length();
Why not "long size = ..."?
byte buff[] = new byte[size];
FileInputStream fis = new FileInputStream(f);
DataInputStream dis = new DataInputStream(fis);
dis.readFully(buff);
dis.close();
Class klass=m.defineClass("scratch.Main",buff,
0,buff.length);
Main m2=(Main) klass.newInstance();
}
}
I get:
Exception in thread "main" java.lang.ClassCastException: scratch.Main
cannot be cast to scratch.Main
at scratch.Main.main(Main.java:29)
Looks to me like the two classes are loaded from different class loaders. The
cast uses Main from the "normal" class loader to cast a Main from the custom
class loader, thus not compatible.
I'm very inexperienced with ClassLoader idioms so I am far from sure of this
analysis.
Maybe you'd be better off using a ClassLoader that isn't the class already
loaded in order to run the ClassLoader that it itself is.
--
Lew