您可以试试。
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),如果使用该方法或更早,则会发生错误。