Java的Class类

193 篇文章 9 订阅
107 篇文章 0 订阅

一个Class对象包含了某个特定结构(class、interface、enum、annotation、primitive type、void)的有关信息。

  • Class本身也是一个类
  • Class对象只能由系统创建
  • 一个加载的类在JVM中只会有一个对应的Class对象
  • 一个Class对象对应的是一个加载到JVM中的一个.class文件
  • 每个类的实例都会记得自己是由哪个Class实例所生成
  • 通过Class可以完整地得到一个类中的所有被加载的结构
  • Class类是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得相应的Class对象。

Java中哪些数据类型可以有Class对象

在Java语言中,一切皆是对象。而对象主要分为两种,一种是普通类创建的实例对象,一种是Class类对象。每个类运行时的类型信息就是通过Class对象表示的,这个对象包含了与类有关的信息。其实Java中的实例对象就是通过Class对象来创建的,Java使用Class对象执行其RTTI(运行时类型识别,Run-Time Type Identification),多态是基于RTTI实现的。

那么在Java中哪些类型可以有Class对象呢?

  • class:外部类、成员(成员内部类、静态内部类)、局部内部类、匿名内部类
  • interface:接口
  • []:数组
  • enum:枚举
  • annotation:注解@interface
  • primitive type:基本数据类型
  • void

我们用代码演示一下,这些类型的Class对象都是什么?

Class c1 = Object.class; // 类
Class c2 = Comparable.class; // 接口
Class c3 = String[].class; // 一维数组
Class c4 = int[][].class; // 二维数组
Class c5 = Override.class; // 注解
Class c6 = ElementType.class; // 枚举
Class c7 = Integer.class; // 基本数据类型(包装类)
Class c10 = int.class; // 基本数据类型
Class c8 = void.class; // 空类型
Class c9 = Class.class; // Class
​
System.out.println(c1); // class java.lang.Object
System.out.println(c2); // interface java.lang.Comparable
System.out.println(c3); // class [Ljava.lang.String;
System.out.println(c4); // class [[I
System.out.println(c5); // interface java.lang.Override
System.out.println(c6); // class java.lang.annotation.ElementType
System.out.println(c7); // class java.lang.Integer
System.out.println(c10);// int
System.out.println(c8); // void
System.out.println(c9); // class java.lang.Classint[] a = new int[10];
int[] b = new int[100];/*
    对于数组,只要元素类型与维度一样,就是同一个Class对象
 */
System.out.println(a.getClass()); //class [I
System.out.println(b.getClass()); //class [I
​
System.out.println(b.getClass().hashCode()); //1735600054
System.out.println(a.getClass().hashCode()); //1735600054

Class对象的存储位置

Class对象存储在堆中,类型信息存储在方法区中

类型信息是一个java类的描述信息,classloader加载一个类时从class文件中提取出来并存储在方法区。它包括以下信息:
1.基本类型信息
2.该类型的常量池
3.字段信息(Field Information)
4.方法信息(Method Information)
5.类(静态)变量(Class Variables)
6.指向ClassLoader类的引用
7.指向Class类的引用

参考:
Java语言中的Class类
JAVA反射的基础–Class对象、类加载器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值