protected Class<?> findClass(final String name)
throws ClassNotFoundException
{
try {
return (Class)
AccessController.doPrivileged(new PrivilegedExceptionAction() {
public Object run() throws ClassNotFoundException {
String path = name.replace('.', '/').concat(".class");
Resource res = ucp.getResource(path, false);
if (res != null) {
try {
return defineClass(name, res, true);
} catch (IOException e) {
throw new ClassNotFoundException(name, e);
}
} else {
throw new ClassNotFoundException(name);
}
}
}, acc);
} catch (java.security.PrivilegedActionException pae) {
throw (ClassNotFoundException) pae.getException();
}
}
这是类加载器加载类的时候的源代码,可以看到,String path = name.replace('.', '/').concat(".class");
它将你输入的url手动的加了个.class,还将所有的点换成了/,所以我们才可以用包名.类名的方式来调用这个类,而实际上找的是文件系统中的.class文件。
前面古同学的理解是对的。
如果要实现你那样写还不报错的话,还需要些一大段代码
if(path.endsWith(".class")){
StringBuffer sb = new StringBuffer();
sb.append(name.substring(0,name.lastIndexOf('.')).replace('.','/'));
sb.append(name.substring(name.lastIndexOf('.'),name.length()));
path= sb.toString();
}
将这段加进去,重新编译JVM,应该能够解释.class的文件了。
老实说,我没具体试过。。但是原理就是在这里了 |