2011-03-25 93 views

回答

3

resolve参数控制所加载的类是否被链接。在链接期间,静态常量被初始化并分配内存。此外,该类是验证的正确性,并可能链接到其他类将得到解决。

例如,如果您希望加载可能格式错误的新类,并且不希望JVM在类错误的情况下抛出验证错误,这可能很有用。

1

该类在第一次使用时(或至少是使用过的部分)无论如何都被链接 - 使用resolve标志可以使VM立即而不是稍后执行此链接(并抛出相关错误)。

1

您可以试试。

public class Test3 { 

    static{ 
     new Test(); 
    } 
} 

编译之后,测试类从具体类的interface.but改变仍然Test3的链接到一个具体的类Test.Then如果决心是假的,JVM会找不到这个error.It的很有意思。实际上,Class someClass1= Class.forName("Test3",false,cls)也不会解析Test3,这意味着不会抛出错误。

但是,如果您在subClass或Class.forName("Test3")中设置resolve为true,那么运行时中的JVM将查找类链接错误。

供您参考,Java语言规范 - 12.3 Linking of Classes and Interfaces解释resolveClass做什么。类和接口的

12.3 链接 链接是采取一个类或接口类型的二进制形式并将其组合成Java虚拟机的运行时状态,以便它可以被执行的处理。类或接口类型始终在链接之前加载。链接中涉及三种不同的活动:符号引用的验证,准备和解析。链接的精确语义在Java虚拟机规范第二版的第5章中给出。这里我们从Java编程语言的角度给出一个过程的概述。

12.3.3符号引用分辨率 一个类或接口的引用其它类和接口和它们的字段,方法和构造象征性的二进制表示,使用其它的类和接口的二进制名称(§13.1) (§13.1)。对于字段和方法,这些符号引用包括声明字段或方法的类或接口类型的名称,以及字段或方法本身的名称以及适当的类型信息。 在使用符号引用之前,它必须经过解析,其中符号引用被检查为正确的,并且通常用直接引用替代,如果引用被重复使用,则可以更有效地处理符号引用。

如果在解析过程中发生错误,则会抛出错误。通常,这将是类IncompatibleClassChangeError的以下子类之一的实例,但它也可能是IncompatibleClassChangeError的某个其他子类的实例,或者甚至是类IncompatibleClassChangeError本身的一个实例。此错误可能在使用的符号参照的类型的程序的任何点被抛出,直接或间接地:

IllegalAccessError:一个符号引用已经遇到一个指定字段的使用或分配,或调用或者创建一个类的实例,由于该字段或方法被声明为私有的,受保护的或默认访问权限(不是公共的),或者因为该类未声明,因此包含该引用的代码无法访问该类的实例上市。 例如,如果在引用该字段的另一个类已编译(第13.4.6节)之后,最初声明为public的字段被更改为private,则会发生这种情况。

InstantiationError:在类实例创建表达式中遇到了符号引用,但实例无法创建,因为引用指向接口或抽象类。 例如,如果在引用相关类的另一个类已编译(第13.4.1节)之后,最初不是抽象的类会更改为抽象类型,则可能发生这种情况。

NoSuchFieldError:遇到引用特定类或接口的特定字段的符号引用,但类或接口不包含该名称的字段。 例如,如果在引用字段的另一个类被编译(第13.4.7节)之后从类中删除了一个字段声明,则会发生这种情况。

NoSuchMethodError:遇到一个符号引用,它引用特定类或接口的特定方法,但类或接口不包含该签名的方法。 例如,如果在引用方法的另一个类被编译后(第13.4.11节)从类中删除了方法声明,则可能发生这种情况。 此外,如果一个类声明了一个本机方法,但没有找到任何实现,则可能抛出一个UnsatisfiedLinkError的一个子类LinkageError)。根据虚拟机正在使用哪种分辨率策略(§12.3),如果使用该方法或更早,则会发生错误。

相关问题