看到Class的时候,我们是不是会一下子想到我们敲代码中的class呢?此Class非彼class,这里讲的Class类实际上就是java类的统称,我们能够将其称之为抽象的类不是详细的一个类的名字。

 1.     概念

  Java程序中的各个java类属于同一个事物,描写叙述这类事物的java类名就是Class。

或许这个解释还是不够清晰,再细点说:

Java类用于描写叙述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么。则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值,java程序中的各个java类。他们是否属于同一类事物,是不是能够用一个类来描写叙述这个类事物呢?那么这个类的名字就是Class。

  值得注意:不同于小写的class.Class类描写叙述了类的名字。类的訪问属性,类所属于的包名,字段名称的列表。方法名称的列表等等,这是反射的基础。

 2.     本质解析

  举个简单的样例来解释:人的名字是person,那么java类的名字就是Class。

 我们假设将人进行实例化,那么事实上例化对象则是张三或者李四等等。Class类代表一个个的java类,那么它的各个实例对象又是什么呢?

  Class类的实例对象相应的是各个类在内存中的字节码,比如,person类的字节码,Date类的字节码等等。

一个类被类载入器载入到内存中,占用一片存储空间。这个空间里面的内容就是类的字节码。不用的类的字节码是不同的,全部它们在内存中的内容是不同的。

那么详细什么是字节码吗?

 3.     字节码

  Ø 定义

  当我们在源程序中用到了person类的时候,首先须要在硬盘上将这个类的二进制代码编译成Class放在硬盘上,就是一群二进制代码。须要将这群二进制代码载入到内存中来,才干够使用它创建一个个的对象,首先要将类的字节码载入到内存中来,再用这个字节码去读取一个个的对象来。当程序中用到了好多个类的时候。那么内存中就应该存在几个字节码。每一份字节码就是一个Class的实例对象。

  我们知道对于之前我们见过的类比方person。当我们用其对象时,能够使用:

  Person p1=newPerson();可是Class是不能直接用new Class直接获取到的,比方

   Class cs1=字节码;cs1代表内存中的一个字节码,比方说我们将其相应相应的对象,则是

   Classcs1=Date.class;//字节码1

   Classcs2=Person.class;//字节码2

  Ø 怎样得到字节码

  通常情况下我们能够採用三种方式获取到字节码:

  第一种类名.class   比方:System.class

  举个样例:Classcls1=Date.class;//字节码;这里採用的Date就是一个类,我们常常使用的String等等并非原始的基本数据类型。而是类。通常情况下存在八种基本数据类型。各自是boolean、byte、char、short、int、long、float anddouble。

  另外一种对象.getClass()   比方:new Date().getClass()

  以上面的样例为例,比方 Person p1=new Person();那么P1就是一个实例化的对象也是P1字节码得到的详细的对象,这样我们就去拿到它的字节码,也就是p1.getClass();

  第三种Class.forName(“类名”)  比方:Class. forName(“java.util.Date”);

  此外Class这个类还存在一个静态的方法那就是forName();括号里的类名必须指定的是完整的类名,比方Class. forName(“java.util.String”);这也是相当于将抽象类找到详细的类,也就是String类的字节码;假设这个类本身已经载入到内存中来了,那么就不须要再次进行载入了.

  forName的作用是返回字节码。返回方式存在两种:

  1、 这份字节码以前被载入过。已经呆在载入器里面了,那么直接返回就可以。

  2、 Java虚拟机中还没有这个字节码。则用内载入器去载入。把载入进来的字节码缓存在虚拟机中,以后要得到这份字节码就不用再载入了。

  三种方式最优的是Class.forName();

  第三种的优点是动态编译的而不是静态的,前两者都是在编译的时候已经确定了类型。可是第三种能够在执行的时候进行配置。由于是字符串,那么我们能够定义一个变量进行存储。也就是说在配置文件里执行的时候动态给其赋值。

  值得注意:以上三种方式均是能够得到字节码,而且三种获取字节码的方式在内存中实际上是同一份字节码。

  1. String str1 = "abc";
  2. Class cls1 = str1.getClass();
  3. Class cls2 = String.class;
  4. Class cls3 = Class.forName("java.lang.String");
  5. System.out.println(cls1 == cls2);
  6. System.out.println(cls1 == cls3);

  打印的结果均为true,说明三种获取字节码的方式在内存中实际上是同一份字节码。

  Ps:推断一种类型是不是基本数据类型,通常情况下我们能够这种代码进行推断。int.class.isPrimitive()。此外我们还能够使用:int.class==Integer.TYPE来查看是否是基本数据类型。

  Type属性相同适用于其它的类比方Boolean.TYPE。Character.TYPE,Byte.TYPE。Short.TYPE。Integer.TYPE。Long.TYPE,Float.TYPE,Double.TYPE,Void.TYPE。

 4.     小结

  了解Class类为我们了解反射机制奠定了基础。这是学习反射的前提。

Java之旅(1)—Class类的更多相关文章

  1. JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

    JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个 ...

  2. JAVA之旅(十六)——String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较

    JAVA之旅(十六)--String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较 过节耽误了几天,我们继续JAVA之旅 一.String概述 String时 ...

  3. JAVA之旅(九)——Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类

    JAVA之旅(九)--Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类 天天被一些琐事骚扰,学习还得继续 一.Object类 Obj ...

  4. JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块

    JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 ...

  5. JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!

    JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...

  6. JAVA之旅(三十三)——TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录

    JAVA之旅(三十三)--TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录 我们继续网络编程 一.TCP 说完UDP,我们就来说下我们应该重点掌握的TCP了 TCP传输 Soc ...

  7. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  8. JAVA之旅(二十九)——文件递归,File结束练习,Properties,Properties存取配置文件,load,Properties的小练习

    JAVA之旅(二十九)--文件递归,File结束练习,Properties,Properties存取配置文件,load,Properties的小练习 我们继续学习File 一.文件递归 我们可以来实现 ...

  9. JAVA之旅(二十八)——File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤

    JAVA之旅(二十八)--File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤 我们可以继续了,今天说下File 一.File概述 文件的操作是非常 ...

  10. JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片

    JAVA之旅(二十六)--装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片 一.装饰设计模式 其实我们自定义re ...

随机推荐

  1. vue2.0 自定义指令详解

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. element ui 在vue中使用可能遇到的问题

    组件使用参照官网http://element.eleme.io/#/zh-CN/component/quickstart 在 main.js 中写入以下内容: import Vue from 'vue ...

  3. Win10浏览器Spartan无法全屏

    昨天尝鲜win10 Build 10074 msdn pro版,新版微软吹嘘的Spartan浏览器看视频是无法像IE一样全屏的.网上搜索了一下也没有解决方法.不过看到一个可以打开隐藏设置实验功能的方法 ...

  4. 【4412开发板使用经验分享】迅为4412开发板I2C驱动问题

    本文转自迅为论坛:bbs.topeetboard.com 我想写DS3231 的驱动 但是读回的数据老是-6 硬件: 我I2C设备连接的这几个GPIO,看了2.5的手册,接口应该是链接正确的 软件 分 ...

  5. 反射(hasattr,getattr,delattr,setattr)

    反射(hasattr,getattr,setattr,delattr) 反射在类中的使用 反射就是通过字符串来操作类或者对象的属性 反射本质就是在使用内置函数,其中反射有四个内置函数: hasattr ...

  6. Flutter web环境变量搭建及开发

    使用flutter开发app已有三个月,有一些行为形成了惯性,在搭建flutter web环境变量时走了不少的坑,分享出来,免得其他小伙伴再走一遍. 首先flutter的版本要使用1.5及以上版本 d ...

  7. CAD绘制二维码(网页版)

    js中实现代码说明: //新建一个COM组件对象 参数为COM组件类名 var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint"); ge ...

  8. Oracle数据库自定义函数练习20181031

    --测试函数3 CREATE OR REPLACE FUNCTION FN_TEST3 (NUM IN VARCHAR2) RETURN VARCHAR2 IS TYPE VARCHAR2_ARR ) ...

  9. [实现] 利用 Seq2Seq 预测句子后续字词 (Pytorch)

    最近有个任务:利用 RNN 进行句子补全,即给定一个不完整的句子,预测其后续的字词.本文使用了 Seq2Seq 模型,输入为5个中文字词,输出为一个中文字词. 目录 关于RNN 语料预处理 搭建数据集 ...

  10. HDU - 2612 Find a way(BFS搜索)

    题目: 链接 思路: 用BFS分别以‘Y’和‘M’的位置为起点进行两次搜索,并把这两次的搜索结果在一个二维数组中保存下来,在对地图遍历遇到‘@’更行最小值. PS: 如果用‘Y’和‘M’点分别去搜每个 ...