082.JAVA反射机制_Class类和Class实例


博主的 Github 地址


1. Class 类

  • 该类的实例表示正在运行的 Java 应用程序中的类和接口(运行时的状态).

  • Java 程序在运行时, 系统一直对所有的对象进行运行时类型标识(信息).

  • 这项信息纪录了每个对象所属的类. JVM 通过运行时类型信息选择正确方法去执行,
    用来保存这些运行时类型信息的是 Class 类对象.

  • 当装载类时, Class 类型对象会通过 JVM 自动创建.

  • Class 没有公共构造方法. Class 对象是在加载类时,
    由 JVM 以及通过调用类加载器中的 defineClass 方法自动构造的,
    因此 Class 对象不能显式地声明.


1.1. Class 类的实例

  • Class 实例表示在 JVM 中的类或者接口.
  • 实际上就是 JVM 中的一份份字节码.
1.1.1. 实例分类
  • 枚举是一种类, 注释是一种接口.

  • 每个数组属于被映射为 Class 对象的一个类, 所有具有相同元素类型
    和维数的数组都共享该 Class 对象.

  • 基本的 Java 类型 boolean, byte, char, short, int, long, float, double
    和关键字 void 也表示为 Class 对象.


2. Class 常用方法

2.1. 一般类或接口对象的 Class 对象的获取

  • 由于 Class 对象不能显式地声明. 因此需要有方法进行返回该类对象.
2.1.1. 方式 1
  • 调用 Object 类的 getClass() 方法来得到 Class 对象.
      MyObject x;
      Class c1 = x.getClass();
2.1.2. 方式 2
  • 使用 Class 类的中静态 forName() 方法获得与字符串对应的 Class 对象.
      Class c2 = Class.forName("MyObject");
2.1.3. 方式 3
  • 如果 T 是一个 Java 类型, 那么 T.class 就代表了匹配的类对象.
      Class cl1 = Manager.class;
      Class cl2 = int.class;
      Class cl3 = Double[].class;
2.1.4. 注意事项
  • 每份字节码文件 JVM 只会创建一个 Class 对象, 这个对象是唯一的.

  • Class 对象实际上描述的只是类型, 而这类型未必是类或者接口.
    例如上面 int.class 是一个 Class 类型的对象.

  • 由于历史原因, 数组类型的 getName() 方法会返回奇怪的名字.


2.2. 九大内置 Class 对象的获取

  • 由于基本数据类型不能表示为对象, 就不能用 getClass() 方法,
    基本类型也没有类名的概念, 因此也不可以使用 Class.forName() 的方式.

  • 但是所有数据类型都有 class 属性, 因此基本数据类型可以调用这个属性.

  • 这是因为 JAVA 中内置了九大 Class 实例, 可以提供调用.
    这些实例对应 boolean, byte, char, short, int, long, float, double, void. 因此基本类型的 class 属性就是从这些内置的实例进行获取的.

  • 在 8 大基本数据类型对应的包装类中, 都存在一个 TYPE 常量,
    这个常量用于返回该包装类对应基本类型的字节码对象.


2.3. 数组的 Class 实例的获取

  • 数组是引用数据类型, 因此数组本质上是对象.

  • 但数组也没有类名的概念, 因此只能调用 class 属性
    getClass() 方法进行获取 Class 实例.

  • 注意:
    所有具有相同数据类型和数组维数的数组都共享同一个
    Class 对象和数组内元素没有关系.

    int[] arr1 = {1,2,3};
    int[] arr2 = {1,1,1,1,1,1,1,1,1,1};
    //输出为 TRUE
    System.out.println(arr1.getClass() == arr2.getClass());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值