本帖最后由 pandapan 于 2014-5-16 21:15 编辑
首先声明,本人不是大神。不过我说说个人的一些理解吧,从熟悉的知识慢慢过渡到这个话题。1. 先说说最基本的吧,我们编写完java代码,是要先编译为class文件,然后运行,是吧。为什么不能直接运行,而需要编译呢,这是因为java虚拟机不认识.java文件,但是他认识.class文件。也就是说他能够将.class文件加载到java虚拟机中,然后进行处理,这个是肯定知道的吧。(当然,如果你自己设计一个虚拟机,将编译和运行识别为一体也是可以的,不过没有什么重大的意义吧。)
2.那么在思考第二个问题,为什么我自己编写的类也能够创建对象呢,java虚拟机是怎么处理的呢?这就用到了.class文件了,根据我们import的规定,我们相当于将自己的类存放的地址,告诉了java虚拟机,所以他找到了。找到了之后,他做什么呢?把这个.class文件加载到虚拟机中,进行处理.但是.class文件和加载到内存中的东东是否一样呢?这个是有差异的,(差异的部分我们先不说,这里我就是概括的说了一下类加载器,但是说法有些差异),我们知道有差异就可以了,加载后的东东我们称之为类的字节码。
3。通过第二点便知道,用到一个类,虚拟机会加载的,这个过程是虚拟机(实际是类加载器)做的,那么我们能否自己来找这个类的.class文件,并且将他加载到内存中呢?举一个小的例子吧,我们通过一个相对包的地址,例如传智播客下的一个类叫做Example,相对顶层的类的全路径为com.itcast.Example,我们要把他加载到内存中,怎么做呢?java语言呢?已经把这部分实现的过程给我们封装好了。说到这里,我们先不说实现使用的是什么。先来说说实现的思想
4. 类中有属性,方法,构造方法,访问修饰符,方法的参数等等乱七八糟的东西,假如我们可以自己手工来加载这个类的信息,加载之后用来做什么呢?加载一个类,肯定是想我们自己来调用这个类的方法,但是怎么调用呢?考虑到这个问题,需求我们分析的就已经差不多了,我们知道,万物都是对象,那么字节码,方法,属性,构造方法,访问修饰符是不是也可以抽象为对象呢?答案是肯定可以的。
(1)字节码->Class
(2)方法->Method
(3)构造方法->Constructor
(4)属性->Field
(5)访问修饰符->Modifier
我先说道这里吧,希望能够帮到你。
下面是我个人在csdn博客中比上述具体一点的知识,涉及到具体用法的,链接地址给你吧。
http://blog.csdn.net/shifengzhongdexiao/article/details/25552329
|