反射机制(二)获取Class实例的三种方式
2018-06-02 本文已影响15人
无关风月oo
获取Class实例
import java.util.Date;
//获取字节码对象(Class对象)
public class GetClassInstance {
public static void main(String[] args) throws Exception {
//需求:获取java.util.Date类的字节码对象
// 方式一:使用class属性
Class<java.util.Date> clz1 = java.util.Date.class;
// 方式二:通过对象的getClass方法来获取,getClass是Object类中的方法;返回次Object的运行时类
java.util.Date date = new java.util.Date();
Class<?> clz2 = date.getClass();
// 方式三:通过Class类中的静态方法forName(String className);
Class clz3 =Class.forName("java.util.Date");
System.out.println(clz1);
System.out.println(clz2);
System.out.println(clz3);
System.out.println(clz1 == clz2);
System.out.println(clz1 == clz3);
System.out.println(clz3 == clz2);
/*Console:
class java.util.Date
class java.util.Date
class java.util.Date
true
true
true
*/
}
}
第三种使用最多,框架中大量使用;
九大内置的Class实例
思考一个问题:
在前面讲述了三种获取Class对象的方式,基本数据类型不能表示为对象(注意:包装类包装的是值),也就不能使用getClass()的方式,基本类型没有类名的概念,也就无法使用Class.forName()的方式,如何表示基本类型的字节码对象呢?
所有的数据类型都有class属性,其语法为:
Class clz = 数据类型.class ;
九大内置Class实例:
-JVM预先提供好的Class实例,分别为:
byte,short,int,long,float,double,char,boolean,void;
注意这里的void也是属于基本类的。
在八大基本数据类型的包装类中,都有一个常量 :TYPE;用于返回该包装类对应基本类的字节码对象;
System.out.println(Integer.TYPE == int.class);//true
注意:Integer和int是不同的数据类型
对System类中的identityHashCode()简单说明一下:
一个对象的identityHashCode能够始终和该对象的内部地址有一个相对应的关系,从这个角度来讲,它可以用于代表对象的引用地址。
public class IntClasses {
public static void main(String[] args) {
Class<Integer> a = int.class;
Class<Integer> b = Integer.TYPE;
Class<Integer> c = Integer.class;
System.out.println(System.identityHashCode(a));
System.out.println(System.identityHashCode(b));
System.out.println(System.identityHashCode(c));
}
}
示例输出(每次都是不同的,但前两个总是相同的,第三个实际上总是不同的,因为是JVM内置的):
1627674070
1627674070
1360875712
数组的Class实例
数组是引用数据类型,数组其实是对象;
-在Object类中开头有说明:
/*
Class {@code Object} is the root of the class hierarchy(等级体系 ).
- Every class has {@code Object} as a superclass. All objects,
- including arrays, implement the methods of this class.
*/
--接口是一种特殊的类,也可以调用Object类中的方法;
如何表示数组的Class实例:
int[] arr1 = {1,2,3};
//方式一:数组类型.class;
Class<int[]> arr1Class = int[].class
//方式二:数组对象.getClass();
Class<int[]> arr2Class = arr.getClass();
System.out.println(arr1Class == arr2Class);
//true -比较的是否为同一份字节码;
//*注意:所有具有相同的维度和相同元素类型的数组共享同一份字节码对象,和元素没有关系!
//-Object类中有说明;
即:int[] arr2 = {4,5,6,7,8,9};
System.out.println(arr1.getClass() == arr2.getClass());//true
Class与Object的区别
Class:描述所有的类型,所以在Class类中应该具有所有类型的相同方法;
Object:描述所有的对象,所以在Object类用应该具有所有对象的共同的方法;