[讨论] ClassLoader的loadClass方法疑惑

djj2007 2012-12-18
ClassLoader中有一个方法loadClass(String name,boolean resolve),在看深入java虚拟机时,作者说1.2版本以后,resolve参数已经无效,就算设置为true,虚拟机也不一定会执行类初始化方法块,虚拟机规范将这个是否执行的权限交由特定的虚拟机来实现,而不做强制的规定。
是这样的吗?
RednaxelaFX 2012-12-18
那个参数根据JavaDoc所说确实不强制要求VM对指定的class做link咯。

http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#loadClass(java.lang.String,%20boolean)
引用
If the class was found using the above steps, and the resolve flag is true, this method will then invoke the resolveClass(Class) method on the resulting Class object.


http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#resolveClass(java.lang.Class)
引用
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.
djj2007 2012-12-19
resolve的说明里,是说按照java语言规范的执行一章来实现。
java语言规范将连接的权限交由具体虚拟机,具体虚拟机可能提早或者延迟对类进行初始化,是这个意思吗?
RednaxelaFX 2012-12-19
引用的文档的关键点是“may be”。也就是说这个方法有没有实际效果都行,API层面没强制规定。所以虚拟机决定什么时候link其实都可以,至少这个方法不保证类一定会被link
djj2007 2012-12-19
RednaxelaFX 写道
引用的文档的关键点是“may be”。也就是说这个方法有没有实际效果都行,API层面没强制规定。所以虚拟机决定什么时候link其实都可以,至少这个方法不保证类一定会被link



多谢R大~~
Global site tag (gtag.js) - Google Analytics