多多吃红薯,好好学java--浅析类加载过程及类加载器(一)

Java和其他语言一个很大的不同点就是java编译器会把java源文件(.java)先编译成一个与平台无关的.class文件(类文件)

当运行一个java程序时,.class并不是本地可执行的,为了可以在本地执行程序,JVM首先要把.class文件装入自己,JVM自身有一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域,它对用户平台进行了进一步的抽象。

顺便一说,稍微了解一下JVM内存模型对多线程的理解是非常有帮助的.

如果从跨平台的角度看,JVM的作用就好似一个翻译,不同的JVM有不同的解释器,它将装载进来的.class翻译成目标机器的机器语言.所以不论.java文件是从哪里编译的,只要本地主机有运行环境就都可以运行,也就实现了跨平台.

回过头来说说这个类加载器,上面说的.class文件装入JVM的过程是由类加载器来完成的。

那么,类何时被加载呢?

众所周知,main方法是程序的入口点,它是个静态方法,可能和我一样的初学者都曾对这个方法感到迷惑,mian方法的参数为何为String[]类型呢?main方法为什么是静态的呢?带有main方法的类访问权限为何必须为public呢?(你的含有的主方法的类可以不是public的?那你一定是你的'main'非彼main)

首先,解释第一个问题,String[] 对应的是你在运行程序时在命令行可以输入的那些参数

关于第二个问题,是我们需要重点关注的问题,main方法是程序的入口,也就是JVM会首先找到的那个点,那还是个盘古初开的世界,还没有任何对象(这么说是不负责任的后面会说到),

所以JVM只能通过类来调用main方法,所以main方法需要是静态的,也就是main方法是类的方法,其实这也间接的解释了第三个问题,为何含有main的类必须是public,因为不管这个类在任何包下,它都要能被JVM看到。

我们已经快要接近事情的真相了,当我们运行一个java程序时(这个程序必须有main方法否则你根本运行不起来)因为此时JVM知道即将要调用一个类的main方法了,而main方法是属于某一个类的,所以JVM就知道了,在真正调用main方法之前,需要正确的构建出这‘某个类’。我们前面所说的装载太粗化了,实际上它是经过3个步骤的


装载就是把.class的字节文件装入JVM

第二步主要是对.class文件进行验证,它主要是验证此时的.class和编译器编译后的.class想不相同,是否被非法的修改了。

第三步就是对类的静态区域分配内存及初始值

这里有何疑惑? 内存的分配是在第三步还是第二步呢?求指点。

对了还有一点没说,一个相同类只会被加载一次,所以在一个JVMstatic域是被它所有的对象共享的(但为了共享一个变量,请不要使用随意使用static

请仔仔细细的记住俩个词,一个是‘同一个类’,另一个是一个‘一个JVM中’,这些到后面会用到

我好像还是没说,类何时被加载?

我只想说一句,在它首次被需要的时候,对,就是这么简单。

当你访问一个类的静态变量时,这个类显然是被需要了,然后确定其是否被装载过,如果没,就要经过上面3个步骤,

当你要new一个类的对象时(不要被语法迷惑,实际上构造器也是静态的,这也是必然的,想想为什么?),显然这个类又被需要了,所以要经过上面3个步骤

当你new一个类的对象时,而这个类是有父类的(子类的构造显然是需要在父类被正确构造的前提之下的,如果用过js特别是使用Ext UI继承的同学会对这句话深有体会),显然父类又被需要了,所以又要经过上面3个步骤。

当然,反射,也是一样的过程,因为我们需要类对象,类对象又是个新名词了,反射和类对象后面会说到。

值得注意的就是‘首次被需要’和‘访问静态(属性,方法)’,对了,再说一次,构造器是静态的,再想想那时为什么,还有一点差点忘了,访问static final type XX = XX时类是不会被需要的,因为这样的一个字段是在编译后就确定的了,它被放到了JVM的常量池了。

除了死记住书本中那些初始化的过程那些规则外,当不确定初始化随时问问自己类是否真切的被需要。

嗯,最基本的东西就说完了,接下来的第二部分共同学习一下ClassLoader的用法,以及编写自己的ClassLoader

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值