• JAVA-初步认识-第十一章-object类-Getclass方法


    一.

    只看名字,是获取类的意思。

    什么叫运行时类?

    现在进行一个前期的铺垫介绍,在创建对象前先要有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讲解做铺垫。

  • 相关阅读:
    搜索各种按钮图标的网页
    查找数据库中所有有自增列的用户表
    清明时节的随想
    基础数据的来源的统一
    使用VS2012开发的网站或者webservice在IIS6.0上发布的注意事项
    [六、页面跳转]21快速打开一个警告窗口
    [六、页面跳转]17使用@SceneStorage存储各个场景的状态
    [六、页面跳转]15使用@Environment访问环境中的指定key的值
    [六、页面跳转]22快速打开一个动作表单
    [六、页面跳转]20通过popover方法快速打开模态窗口
  • 原文地址:https://www.cnblogs.com/wsw-bk/p/8026266.html
Copyright © 2020-2023  润新知