Class类分析

Class对象一般使用于反射情况下

通过反射可以在运行期获取对应类的Class类型信息,Class中存储了类的几乎所有信息,当然这些信息是未初始化的信息,比如所有方法,所有的构造函数,所有的字段(成员属性)等等。

Class对象生成方式 :

1:类名.class:

jvm把类加载进内存但不进行初始化,返回Class对象

2:Class.forName(“包名.类名”):

装入类,默认同时进行静态初始化,返回Class对象 Class.forName(“包名.类名”,false,类加载器); 第二个参数False表示不初始化,True则进行初始化

3:实例对象.getClass():

对类进行静态初始化、非静态初始化,返回引用是运行时真正所指对象(向上转型)所属类的Class对象

父子类Class对象不一致
若类A的实例对象是a,则A.class和a.getClass()返回结果一致。
若A是B的子类,则a.getClass()和B.class不一致。

Class类被创建后的对象就是Class对象,注意,Class对象表示的是自己手动编写类的类型信息,比如创建一个Shapes类,那么,JVM就会创建一个Shapes对应Class类的Class对象,该Class对象保存了Shapes类相关的类型信息。实际上在Java中每个类都有一个Class对象,每当我们编写并且编译一个新创建的类就会产生一个对应Class对象并且这个Class对象会被保存在同名.class文件里(编译后的字节码文件保存的就是Class对象),那为什么需要这样一个Class对象呢?是这样的,当我们new一个新对象或者引用静态成员变量时,Java虚拟机(JVM)中的类加载器子系统会将对应Class对象加载到JVM中,然后JVM再根据这个类型信息相关的Class对象创建我们需要实例对象或者提供静态变量的引用值。需要特别注意的是,手动编写的每个class类,无论创建多少个实例对象,在JVM中都只有一个Class对象,即在内存中每个类有且只有一个相对应的Class对象,挺拗口,通过下图理解(内存中的简易现象图):

img

到这我们也就可以得出以下几点信息:

**1:**Class类也是类的一种,与class关键字是不一样的。

**2:**手动编写的类被编译后会产生一个Class对象,其表示的是创建的类的类型信息,而且这个Class对象保存在同名.class的文件中(字节码文件),比如创建一个Shapes类,编译Shapes类后就会创建其包含Shapes类相关类型信息的Class对象,并保存在Shapes.class字节码文件中。

**3:**每个通过关键字class标识的类,在内存中有且只有一个与之对应的Class对象来描述其类型信息,无论创建多少个实例对象,其依据的都是用一个Class对象。

**4:**Class类只存私有构造函数,因此对应Class对象只能有JVM创建和加载Class类的对象作用是运行时提供或获得某个对象的类型信息,这点对于反射技术很重要(关于反射稍后分析)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值