[讨论] 关于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上,从来没有调用过,这是为什么?
|