Java之旅(1)—Class类

  看到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();

  第三种的好处是动态编译的而不是静态的,前两者都是在编译的时候已经确定了类型,但是第三种可以在运行的时候进行配置,因为是字符串,那么我们可以定义一个变量进行存储,也就是说在配置文件中运行的时候动态给其赋值。

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

		String str1 = "abc";
		Class cls1 = str1.getClass();
		Class cls2 = String.class;
		Class cls3 = Class.forName("java.lang.String");
		System.out.println(cls1 == cls2);
		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类为我们了解反射机制奠定了基础,这是学习反射的前提。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-21 12:23:01

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

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

JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个阳光明媚的周末,一个又一个的周末,周而复始,不断学习,前方的路你可曾看见?随我一起走进技术的世界,流连忘返吧! 一.打印流PrintWriter 打印流有PrintWriter和PrintStream,他的特点可以直接操作输入流还有文件 该流提供了打印方法,可以将各种数据类型原样打印 file对象

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

JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 this的特点 this就代表本类对象 这在我们的set方法里面是有的 public void setName(String name) { this.name = name; } this代表他所在的函数对属对象的引用 现在我们这里有这么一个需求 //公共的 类 类名 public class H

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

JAVA之旅(九)--Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类 天天被一些琐事骚扰,学习还得继续 一.Object类 Object是什么呢?我们可以翻阅JAVA API文档看他的介绍 上面介绍说,object是类层次结构的根类,也就是超类 Object:是所有对象的直接后者间继承关系,传说中的老祖宗,你父亲还有父亲,你父亲的父亲还有父亲是爷爷,这是继承关系,但是你的祖宗却只有一位,该类中定义的肯定是所有对象都具备的功能

JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展

JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来聊聊final这个关键字 final可以修饰类,方法和变量 final修饰的类不可以被继承 final修饰的方法不可以被覆盖 final修饰的变量是一个常量,只能被赋值一次 内部类只能访问被final修饰的局部变量 final,故名思意,就是最终的意思,由以上的五种特性,不过final的出现,也是有

Java之旅--关于多线程

关于多线程的知识,有非常多的资料可以参考.这里稍微总结一下,以求加深记忆. 关于多线程在日常工作中的使用:对于大多数的日常应用系统,比如各种管理系统,可能根本不需要深入了解,仅仅知道Thread/Runnable就够了:如果是需要很多计算任务的系统,比如推荐系统中各种中间数据的计算,对多线程的使用就较为频繁,也需要进行一下稍微深入的研究. ThreadLocal与synchronized 区别ThreadLocal 与 synchronized ThreadLocal是一个线程隔离(或者说是线程

JAVA之旅(四)——面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块

JAVA之旅(四)--面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块 加油吧,节奏得快点了 1.概述 上篇幅也是讲了这点,这篇幅就着重的讲一下思想和案例 就拿买电脑来说吧,首先,你不懂电脑,你去电脑城买电脑,和大象装冰箱里一样,是什么步骤?咨询 砍价 ,谈妥了就那电脑走人,对吧,这就是面向过程的思想,而面向对象是:你有一个哥们,他懂电脑,什么都会,你只要带他去,就行,你这个哥们就是对象,在JAVA中,我们就是操作一个对象去完成各种各样的操作的,这就是面向对

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

JAVA之旅(三十三)--TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录 我们继续网络编程 一.TCP 说完UDP,我们就来说下我们应该重点掌握的TCP了 TCP传输 Socket和ServiceSocket 建立客户端和服务端 建立连接后,通过Socket中的IO流进行数据的传输 关闭Socket 同样的,我们的客户端和服务端都是两个独立的应用 我们通过查阅API文档发现,该对象在建立的时候,就可以去连接指定主机,因为tcp是面向连接的,所以在建立socket服务时,

JAVA之旅

JAVA之旅合集 JAVA之旅(一)——基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算 JAVA之旅(二)——if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结 JAVA之旅(三)——数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想 JAVA之旅(四)——面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造

JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this

JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程)把票陆陆续续的卖完了之后,我们要反思一下,这里面有没有安全隐患呢?在实际情况中,这种事情我们是必须要去考虑安全问题的,那我们模拟一下错误 package com.lgl.hellojava; import javax.security.auth.callback.TextInputCallback

JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用

JAVA之旅(十八)--基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用 JAVA把完事万物都定义为对象,而我们想使用数据类型也是可以引用的 一.基本数据类型的对象包装类 左为基本数据类型,又为引用数据类型 byte Byte int Integer long Long boolean Booleab float Float double Double char Character 我们拿Integer来举例子 //整