- Class类: 用来描述类或者接口的类型,描述类的类
- Class类的实例:在JVM中的字节码,Class实例表示在JVM中的类或者接口,枚举是一种特殊的类,注解是一种特殊的接口
当程序第一次使用某一个类的时候,就会把该类的字节码对象加载进JVM,并创建出一个Class对象
此时的Class对象就表示这个类的字节码
Class类可以表示N个类的字节码对象,使用泛型表示不同类的字节码
- java.lang.String类的字节码类型:Class<java.lang.String>
- java.util.Date类的字节码类型:Class<java.util.Date>
- java.util.ArrayList类的字节码类型:Class<java.util.ArrayList>
如何创建Class对象?如何来表示一个字节码对象?
//获取字节码对象:Class对象
public class ClassInstanceDemo {
public static void main(String[] args) throws Exception {
//需求:获取java.util.Date类的字节码对象
//方式1:使用class属性
Class<Date> clz1 = Date.class;
//方式2:通过对象的getClass方法来获取,getClass是Object类中的方法
Date date = new Date();
Class<?> clz2 = date.getClass();
//方式3:通过Class类中的静态方法forName(String className);
Class<?> clz3 = Class.forName("java.util.Date");
System.out.println(clz1);
System.out.println(clz2);
System.out.println(clz3);
}
}
注意:同一个类在JVM中只存在一份字节码对象,也就是说代码中clz1 == clz2 ==clz3
第三种使用最多,在框架中大量使用
基本数据不能表示为对象,不能用getClass的方式,基本类型没有类名的概念,也不能使用Class.forName的方式
但所有的数据类型都有class属性,Class clz=数据类型.class
九大内置Class实例:JVM中预先提供好的Class实例,分别将
byte,short,int,long,float,double,boolean,char,void
表示为:
byte.class,short.class,int.class,long.class,float.class,double.class,boolean.class,char.class,void.class
在8大基本数据类型的包装类中,都有一个常量TYPE,用于返回该包装类对应的字节码对象
Integer.TYPE == int.class;//true
数组的class实例:数组是引用数据类型,数据其实是对象
如何表示数组的class实例
方式1:数组类型.class
方式2:数组对象.getClass()
所有的具有相同维数和相同元素类型的数组共享同一份字节码,和元素没关系
public class DataTypeClassInstanceDemo {
public static void main(String[] args) {
//基本数据类型class实例
Class booleanClass= boolean.class;
Class intClass= int.class;
//int.class != Integer.class,int 和 Integer是不同的数据类型
System.out.println(Integer.class == int.class);//false
/*
* 如何表示数组的class实例
* 方式1:数组类型.class
* 方式2:数组对象.getClass()
*/
int[] arr1 = {1,2,3};
//1
Class arr1Class = arr1.getClass();
System.out.println(arr1Class);
//2
Class arr2Class = int[].class;
System.out.println(arr2Class);
System.out.println(arr1Class == arr2Class);//true
//所有的具有相同维数和相同元素类型的数组共享同一份字节码,和元素没关系
int[] arr2 = {3,4,5,6};
System.out.println(arr1.getClass() == arr2.getClass());//true
//System.out.println(int[].class == int[][].class);//不兼容
//System.out.println(int[].class == short[].class);//不兼容
}
}
Object:描述所有的对象,所以在Object类中应该具有所有对象的共同的方法
Class:描述所有的类型,所以Class类中应该具有所有类型的相同的方法