日期:2014-05-20  浏览次数:20760 次

关于类加载器的几个疑问
1,我写了个自定义的类加载器MyClassLoader,然后写了个类MyClass,我想用我自己的加载器去加载MyClass,但是调用myLoader.loadClass(MyClass.class)的时候,由于MyClassLoader的父类型加载器(即系统加载器(AppClassLoader))能够加载MyClass,所以用的是AppClassLoader。我想要用MyClassLoader来加载该怎么办?我目前想到了一个方法:把MyClass.class文件重命名为MyClass.myclass,问题解决。但是非得该字节码的后缀才能使用自己的类加载器?

2,我想看看哪几个类被加载了,该怎么看呢?在类的static块中打印一下显然不行,所以不知道该如何实现?

3,看到过这样的说法:JVM由类加载器和执行引擎组成 这样准确吗?

------解决方案--------------------
探讨

引用:

引用:

在第一个问题中 我说的是MyClass.class文件是处于classpath下的

处在classpath中不可能做到你想要的那种效果吧。。JVM安排的父类依赖就是为了安全考虑,父类能加载就让父类加载
你如果说换一个地方来倒是可以指定自定义类加载的path


我也是这么想的 所以我就把……

------解决方案--------------------
噢 你说在被加载的类中啊 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:
Java code

package cn.leisore.daily._2011_10_09;

public class MyClass {

static {
System.out.println("ClassLoader:"
+ MyClass.class.getClassLoader().getClass().ge……

------解决方案--------------------
1,为了保证类加载器都正确实现代理模式,在开发自己的类加载器时,最好不要覆写 loadClass() 方法,而是覆写 findClass() 方法。
2,使用命令java -verbose:class XXX类。
3,见8楼。
------解决方案--------------------
探讨

引用:

噢 你说在被加载的类中啊 static应该是可以在被加载时输出的
加载过程就是 加载 链接和初始化 会执行static块的 明天再看看


static块在加载的时候肯定不会执行(这一点可以把7楼代码的loadClass.newInstance()注释掉即可看出来) 不过不知道是在连接还是初始化的时候才会执行

------解决方案--------------------
探讨

引用:

测试类1:
Java code

package cn.leisore.daily._2011_10_09;

public class MyClass {

static {
System.out.println("ClassLoader:"
+ MyClass.class.getClassLoader().getClass().……

------解决方案--------------------
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;
    }

------解决方案--------------------
探讨

但是我有几个疑问:都说写自定义加载器的时候重写findClass,不知道为什么要这样?重写findClass和loadClass有什么不同?你为什么要重写loadClass?还有就是我这边3个类都是AppClassLoader加载的 跟你的结果不一样