[讨论] 关于ClassLoader的resolveClass方法的疑问~~

whb1984 2013-07-03
ClassLoader的resolveClass方法如下:
    protected final void resolveClass(Class class1)
    {
        resolveClass0(class1);
    }

我看到API上面的注释为(我理解的jvm加载类的link过程,不知道对不对):
引用
Links the specified class. This (misleadingly named) method may be used by a class loader to link a class. If the class c has already been linked, then this method simply returns. Otherwise, the class is linked as described in the "Execution" chapter of the Java Language Specification.


但是通过查找上面文,我发现调用resolveClass的loadClass代码片段如下:
        
    if(flag)
        resolveClass(class1);

而这个flag参数默认一直是false,jvm装载类的三个过程为load ,link,initialize. 那么如果flag参数为false,默认就是jvm加载类的时候就不需要link过程了吗? 因为link还包括3个子步骤(Verify, Prepare, Resolve),这三个子步骤也一并都省略了?那还能保证loadClass返回Class对象是可用的吗? 请大神解答~~
chong_zh 2013-07-04
1. Class载入必须link,link指的是把单一的Class加入到有继承关系的类树中,不link一切都无从谈起了

2.你这里说的link包括的第三个子步骤resolution,指的是去resolve该类的父类、接口等等,而不是resolve该类自己
chenk008 2015-04-30
我也发现这个问题了,断点打在ClassLoader的resolveClass上,从来没有调用过,这是为什么?
Global site tag (gtag.js) - Google Analytics