一.
只看名字,是获取类的意思。
什么叫运行时类?
现在进行一个前期的铺垫介绍,在创建对象前先要有class文件,这是个字节码文件。
先要加载class文件,后面才能接着运算。现在举了一个例子,如下
Demo类和Class类,对它们的共性进行抽取。类文件都有一个共性特点就是,它里面都是源文件中所描述的那些成员,只不过类文件将它们变成了字节码,变成了另外一种符号形式而已。
它们既然有共性,那就可以进行抽取(但这个共性抽取起来比较麻烦,被抽取的内容不是很具体)。抽完以后就形成了类,接着我们用java语言对这个字节码文件进行描述。
能描述字节码文件的类就不需要定义了,它里面有。注意是大写的C,小写是关键字,大写是类名。
它是专门描述字节码文件的类,这里面描述的内容就有很多了,首先无论什么字节码文件都有名称(字节码文件的名称),(这里是对getclass类进行描述)。接着无论什么样的字节码文件里面都有字段field,就是属性,也是成员变量。无论什么样的字节码文件,里面都有constructor,构造器。无论什么样的类文件,里面都有方法。
上述这些都是类文件的组成部分,因此用这个类描述完了类文件这个事物以后,就可以产生类的对象(感觉这像是一个创建对象的前提条件,乃至于是加载类的前提条件)。
这个Class对象是不需要你去new的,而且你也new不了。
这个字节码对象(Test.class)本身就是你字节码一进内存就已经被变成了对象,或者说封装成了对象。你想拿字节码文件里的东西,只要通过Class对象里面的方法就能拿到。
我想拿人里面的东西,有了人对象就易如反掌。因为有方法,getage,getname….
所以这个类在哪儿,就在getclass。getclass方法返回的就是Class对象(万物皆对象,类也是对象)。
现在,我们把这个流程画一下,现在我们读到了person.class文件。一装载进内容,其实第一步就在在堆内存中产生了一个对象,其实这个就是person.class对象。就是字节码文件对象。先把它加载进来,并封装成对象。封装完以后,将它们的内容进行公约分布完以后,我们再产生new的时候,其实在干嘛呀?其实根据字节码文件,在内存中产生了一个person对象。这就是我们说的new person。
如果说还要new相同类型的对象,那就不需要加载class文件了。也就是说内存中的任意一个对象都有自己所属,也就是自己所属的字节码文件。因为对象都是字节码文件创建的(那么这些创建的对象也是字节码格式么?)。
这个getclass方法就是获取当前对象所属的字节码文件对象。
现在做一个演示,
按照上面截图的写法,拿到的就是p1对象所属的字节码文件。
按下图所示,拿到就是Person.class这个对象。
这个对象什么类型,大写的Class类型,往下面看,字节码文件抽取出来的就是大写Class类型。
接着使用getclass方法
我是觉着两者是相等的,因为使用getclass方法后,得到就是一个抽出来的共同的大写Class类。→不对,getclass方法是用来获取字节码文件的,而不是字节码文件的父类。
结果显示,它们就是相等的。
以下图来讲解,person(29)为p1,person(40)作为p2,它们都是以Person.class产生的,它们拿的都是Person.class对象的地址(这里不是比较p1和p2对象的地址,而是它们字节码文件地址,比较的是两个clazz)。一个person.class产生好多对象,都来这这么一个文件,这个对象在内存中只有一份,不可能有第二份。
现在类文件对象被我们拿到了,它是有名字的,
我们看Class这个类里面都有什么。
只要有了类字节码文件对象,它里面有什么东西,我们说拿到就拿到。就和我们有人对象一样,
上面程序运行的结果就是person。
总结:现在回过来,想想调用getclass方法得到的到底是什么东西?
讲解字节码文件抽出出来的父类,可能就是为了后面定义Class clazz1中的Class讲解做铺垫。