获取Class字节码对象的三种方式

时间:2021-02-20 17:07:57

每个类被加载之后,系统就会为该类生成一个对应的字节码对象,通过该字节码对象就可以访问到JVM中的对应的类。在Java中获得Class对象通常有三种方式。


方式一,使用类的class属性:

Class<java.util.Date> clz1 = java.util.Date.class;

方式二,通过Class类中的静态方法forName(String className),传入类的全限定名(必须添加完整包名)

Class<?> clz2 = Class.forName(“java.util.Date”);

方式三,通过对象的getClass方法来实现,其中,getClass()Object类中的方法,所有的对象都可以调用该方法

java.util.Date str = new java.util.Date();

Class<?> clz3 = str.getClass();


第一种方式和第二种方式都是直接根据类来获取字节码对象,相比之下,第一种方式更加安全,因为在编译时期就可以检查要访问的Class对象是否存在,同时不用调用方法,性能也更好,因此用第一种方式比较多。但是如果只能获得一个字符串,如”java.lang.String”,就只能用第二种方式,第二种方式可能会抛出ClassNotFoundException异常。


注意:同一个类在JVM中只存在一份字节码对象,也就说上述,claz1 == clz2 == clz3;


在上述讲了三种获取Class对象的方式,基本数据类型不能表示为对象,也就不能使用getClass的方式,基本类型没有类名的概念,也不能使用Class.forName的方式,如何表示基本类型的字节码对象呢?

实际上,所有的数据类型都有class属性.因此可以用class属性来表示:

                  Class  clz = 数据类型.class;

九大内置Class实例:  

JVM中预先提供好的Class实例byte,short,int,long,float,double,boolean,char,void.

表示为:byte.class,short.class,int.class,....void.class.

另外,在8大基本数据类型的包装类中,都有一个常量:TYPE,用于返回该包装类对应基本类的字节码对象.因此,Integer.TYPE == int.class,但是注意,Integerint是不同的数据类型


基本数据类型的Class实例可以用上面的方式,那么数组的Class实例又可以怎么表示呢?很简单,可以通过class属性,也可以通过对象.getClass()方式。

 

数组的Class实例:数组是引用数据类型,数组其实是对象.

如何来表示数组的Class实例.

    方式1:  数组类型.class;

    方式2:  数组对象.getClass();

 

注意:所有的具有相同的维数和相同元素类型的数组共享同一份字节码对象,和元素没有关系.