JavaMan_KA 2011年08月07日
java类中的链接
Java类的链接

Java类的链接指的是将Java类的二进制代码合并到JVM的运行状态之中的进程。 在链接之前, 这个类必需被成功加载。 类的链接包括验证、准备和解析等几个步骤。 验证是用来确保Java类的二进制表示在构造上是完全正确的。 假如验证进程出现错误的话, 会抛出java. lang. VerifyError错误。 准备进程则是创立Java类中的静态域, 并将这些域的值设为默许值。 准备进程并不会执行代码。

在一个Java类中会包含对其它类或接口的形式援用, 包括它的父类、所实现的接口、方法的形式参数和前往值的Java类等。 解析的进程就是确保这些被援用的类能被正确的找到。 解析的进程能够会导致其它的Java类被加载。

不同的JVM实现能够选择不同的解析战略。 一种做法是在链接的时候, 就递归的把所有依赖的形式援用都停止解析。 而另外的做规律能够是只在一个形式援用真正需要的时候才停止解析。 也就是说假如一个Java类只是被援用了, 但是并没有被真正用到, 那么这个类有能够就不会被解析。 思索上面的代码:

public class LinkTest 。 . 。 {

public static void main(String[] args) 。 . 。 {

ToBeLinked toBeLinked = null; System. out. println(Test link. );

}

}

类 LinkTest援用了类ToBeLinked, 但是并没有真正运用它, 只是声明了一个变量, 并没有创立该类的实例或是访问其中的静态域。 在 Oracle的JDK 6中, 假如把编译好的ToBeLinked的Java字节代码删除之后, 再运行LinkTest, 顺序不会抛出错误。 这是由于ToBeLinked类没有被真正用到, 而Oracle的JDK 6所采用的链接战略使得ToBeLinked类不会被加载, 因此也不会发现ToBeLinked的Java字节代码实际上是不存在的。 假如把代码改成ToBeLinked toBeLinked = new ToBeLinked();之后, 再按照相同的方法运行, 就会抛出异常了。 由于这个时候ToBeLinked这个类被真正运用到了, 会需要加载这个类。

...全文
25 点赞 收藏 回复
写回复
回复

还没有回复,快来抢沙发~

发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告