有些人说是用类加载器,但类加载器不是对存放在jvm虚拟机内存中.calss文件的类进行加载的吗?如果是,那也就是.calss没被加载到jvm虚拟机内存里面之前,那是用什么方法将硬盘上的字节码(.class文件)是如何或用什么加载到jvm里面的内存中的????
------解决方案--------------------
果断是ClassLoader,自己实现的ClassLoader的findClass里可以读取class文件,把读到的byte[]传递给defineClass,这样就完成了加载class文件。
举个例子:
public class PathClassLoader extends ClassLoader {
private File dir;
public PathClassLoader(String path) {
dir = new File(path);
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
if(dir != null) {
File clazzFile = new File(dir, name + ".class");
if(clazzFile.exists()) {
FileInputStream input = null;
try {
input = new FileInputStream(clazzFile);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while((len = input.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
return defineClass(name, baos.toByteArray(), 0, baos.size());
} catch(Exception e) {
throw new ClassNotFoundException(name, e);
} finally {
if(input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
return super.findClass(name);
}
}