反射机制(二)获取Class实例的三种方式

获取Class实例

import java.util.Date;

//获取字节码对象(Class对象)
public class GetClassInstance {
    public static void main(String[] args) throws Exception {
//需求:获取java.util.Date类的字节码对象

//        方式一:使用class属性
        Class 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 a = int.class;
    Class b = Integer.TYPE;
    Class 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 arr1Class = int[].class

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

Class 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类用应该具有所有对象的共同的方法;

你可能感兴趣的:(反射机制(二)获取Class实例的三种方式)