什么是class 对象
Class对象保存每个类型运行时的类型信息,如类名、属性、方法、父类信息等等。在JVM中,一个类只对应一个Class对象
可以将java 中的class 对象看成一个模具,我们new 出来的对象,则是通过模具按压出来的具体模型,模型里面的各种颜色各不相同(对象内的成员)
class 对象的特点:
运行时,class 对象是唯一的,每当JVM加载一个类就产生对应的Class对象,保存在堆区,类型和它的Class对象时一一对应的关系。
一旦类被加载了到了内存中,那么不论通过哪种方式获得该类的Class对象,它们返回的都是指向同一个java堆地址上的Class对象引用。JVM不会创建两个相同类型的Class对象。
class 对象,是class 类的实例,与我们new 出来的对象是一样的(普适性)
获取class 对象的方法
//1. getClass 方法
DataInfo dataInfo = new DataInfo();
Class<? extends DataInfo > aClass = dataInfo.getClass();
// 2. 使用classloader获取
ClassLoader classLoader = Class.forName("com.test.it.test1.api.entity.form.DataInfo");
Class<? extends ClassLoader> aClass1 = classLoader.getClass();
// 3. .class 获取
Class<DataInfo> aClass2 = DataInfo.class;
Q1 如何对比两个类的 class 对象是否相同?
直接用 == 或者 equals 即可,对比引用对象的地址是否相同
boolean equals1 = aClass.equals(aClass2);
boolean equals2 = aClass == aClass2;
Q2 手动创建的普通类和对象以及Class 对象的关系
普通类,通过classloader 类加载器,创建时读取字节码文件创建,并且会同时创建一个class 对象,这个class 对象存储的是类的相关信息,如成员数量,父类信息,这个class 对象是 class 类的实例;在可以通过Class 类提供的forName方法 获取对应的Class 对象的引用,普通类创建的则为实例对象,普通类通过 .class 获取Class引用。
对象与类之间,只能检查 指定对象是否是某个类的实例,具体可以用 intanceof 判断,或者 isInstance() 方法:
isInstance 方法注释:
确定指定的对象是否与此类表示的对象的赋值兼容。此方法是Java语言instanceof运算符的动态等效方法。如果指定的对象参数为非空,并且可以在不引发ClassCastException的情况下转换为此类对象表示的引用类型,则该方法返回true。否则返回false。
具体来说,如果这个类对象表示一个声明的类,如果指定的对象参数是所表示的类(或其任何子类)的实例,则该方法返回true否则返回false。如果此类对象表示数组类,并且指定的对象参数可以通过标识转换或扩大引用转换转换为数组类的对象,则此方法返回true。否则返回false。如果这个类对象表示一个接口,如果指定对象参数的类或任何超类实现了这个接口,这个方法返回true否则返回false。如果这个类对象表示一个基本类型,这个方法返回false。
// 判断 source 对象是否是 IOException 的实例
Throwable source = new RuntimeException();
boolean check = source instanceof IOException;
示例图,图源参考地址
refer:
https://blog.csdn.net/sinat_29846389/article/details/122513297