文章目录
一.什么是class对象
类是程序的一部分,每个类都有一个class对象。换言之,每当编写并且编译了一个新类,就会产生一个class对象(更恰当的说,是被保存在一个同名的class文件中)。为了生成这个类的对象,运行这个程序的Java虚拟机(jvm)将使用被称为“类加载器”的子系统。
所有的类都是在对其第一次使用的时候被加载到JVM中。如当程序创建对第一个静态成员的引用时,就会加载这个类。或者使用new关键字创建新的对象的时候。
因此java程序在它运行之前并非完全加载,其各个部分是在必须的时候才加载的。类加载器首先检查这个类的class对象是否已经加载。如果尚未加载,默认的类加载器就会根据类名查找.class文件。
实际上在Java中每个类都有且只有一个Class对象。
Class 没有公共构造方法,因此不能显式地声明一个Class对象,Class 对象是在载入类时由Java 虚拟机以及通过调用类载入器中的 defineClass 方法自己主动构造的。
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对象,挺拗口,通过下图理解:
到这我们也就可以得出以下几点信息:
- Class类也是类的一种,与class关键字是不一样的。
- 手动编写的类被编译后会产生一个Class对象,其表示的是创建的类的类型信息,而且这个Class对象保存在同名.class的文件中(字节码文件),比如创建一个Shapes类,编译Shapes类后就会创建其包含Shapes类相关类型信息的Class对象,并保存在Shapes.class字节码文件中。
- 每个通过关键字class标识的类,在内存中有且只有一个与之对应的Class对象来描述其类型信息,无论创建多少个实例对象,其依据的都是用一个Class对象。
- Class类只存私有构造函数,因此对应Class对象只能有JVM创建和加载。
- Class类的对象作用是运行时提供或获得某个对象的类型信息,这点对于反射技术很重要(关于反射稍后分析)。
二.获得class对象的三种方法
1、调用Object类的getClass()方法来得到Class对象,这也是最常见的产生Class对象的方法。
比如:
Object n;
Class c = n.getClass();
Object.getClass(), Object中自带的方法;getclass(),返回一个class对象。
2、使用Class类的中静态forName()方法获得与字符串相应的Class对象。
比如:
Class c2=Class.forName(“MyObject”),MyObject必须是接口或者类的名字。
Class c=Class.forName("类的全限定名")
传入string类型参数,要求jvm查找并加载指定的类,返回的是一个class对象的引用。
3、获取Class类型对象的第三个方法是在类型后面加上.class就代表了匹配的类对象。
比如:
Class cl1 =Obeject.class;
Class cl2 = int.class;
注意:Class对象实际上描写叙述的仅仅是类型。而这类型未必是类也有可能是接口。
三.class的作用和方法
getname():以string类型返回class对象表示的实体(类,接口,数组,基本类型,void等)名称
newInstance():创建一个实例,只能调用默认构造器。
getsuperclass():返回class表示的实体超类的名称
getSimpleName()。不办含包名的类名。
isInterfence:告诉你这个class对象是否表示某个接口。
1、getName()
一个Class对象描写叙述了一个特定类的属性,Class类中最经常使用的方法getName以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
2、newInstance()
Class另一个实用的方法能够为类创建一个实例,这种方法叫做newInstance()。比如:
x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器(无參数构造器)初始化新建对象。
3、getClassLoader()
返回该类的类载入器。
4、getComponentType()
返回表示数组组件类型的 Class。
5、getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
6、isArray()
判定此 Class 对象是否表示一个数组类。