关于类加载器的几个疑问
1,我写了个自定义的类加载器MyClassLoader,然后写了个类MyClass,我想用我自己的加载器去加载MyClass,但是调用myLoader.loadClass(MyClass.class)的时候,由于MyClassLoader的父类型加载器(即系统加载器(AppClassLoader))能够加载MyClass,所以用的是AppClassLoader。我想要用MyClassLoader来加载该怎么办?我目前想到了一个方法:把MyClass.class文件重命名为MyClass.myclass,问题解决。但是非得该字节码的后缀才能使用自己的类加载器?
2,我想看看哪几个类被加载了,该怎么看呢?在类的static块中打印一下显然不行,所以不知道该如何实现?
3,看到过这样的说法:JVM由类加载器和执行引擎组成 这样准确吗?
------解决方案--------------------
------解决方案--------------------噢 你说在被加载的类中啊 static应该是可以在被加载时输出的
加载过程就是 加载 链接和初始化 会执行static块的 明天再看看
------解决方案--------------------测试类1:
Java code
package cn.leisore.daily._2011_10_09;
public class MyClass {
static {
System.out.println("ClassLoader:"
+ MyClass.class.getClassLoader().getClass().getName());
}
}
------解决方案--------------------
关于Q3,sun官方的说法是:
类加载器->字节码验证器->解释器->运行时->硬件
|
\/
即时编译器->硬件
------解决方案--------------------
------解决方案--------------------
1,为了保证类加载器都正确实现代理模式,在开发自己的类加载器时,最好不要覆写 loadClass() 方法,而是覆写 findClass() 方法。
2,使用命令java -verbose:class XXX类。
3,见8楼。
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
1.你需要重写loadClass方法,比如像下面这样
Java code
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
// TODO Auto-generated method stub
Class c;
try{
c = findClass(name);
} catch (ClassNotFoundException e) {
c = super.loadClass(name);
}
return c;
}
------解决方案--------------------