Java语言是先把Java源文件编译成后缀为class的字节码文件,然后再通过ClassLoader机制把这些类文件加载到内存中,最后生成实例执行的,这是Java处理的基本机制,但加载到内存中的数据是如何描述一个类的呢?

比如在Dog.class文件中定义了的是一个Dog类,那它在内存中是如何展现的呢?

Java使用一个元类(MetaClass)来描述加载到内存中的类数据,这就是Class类,它是一个描述类的类对象,比如Dog.class文件加载到内存中后就是一个Class实例对象描述.

因为Class是一个类种类,也就预示着它有很多特殊的地方:

1.无构造函数.Java中的类一般都有构造函数,用于创建实例对象,但是Class类却没有构造函数,不能实例化,Class对象是在加载类时由Java虚拟机通过调用类加载器中的defineClass方法自动构造的.

2.可以描述基本类型.虽然8个基本类型在JVM中并不是一个对象,它们一般存在于栈内存中,但是Class类仍然可以描述它们,例如可以使用int.class标识int类型的类对象.

3.其对象都是单例模式.一个Class的实例对象描述一个类,并且只描述一个类,反过来也成立,一个类只有一个Class实例对象,如下代码返回的结果都为true:

public class Client {public static void main(String[] args) throws Exception {//类的属性class所引用的对象与实例对象的getClass返回值相同String.class.equals(new String().getClass());"ABC".getClass().equals(String.class);//class实例对象不区分泛型ArrayList.class.equals(new ArrayList<String>().getClass());}
}

Class类是Java的反射入口,只有在获得一个类的描述对象后才能动态的加载,调用,一般获得一个Class对象有三种途径:

1.类属性方式,如String.class.

2.对象的getClass()方法,如new String().getClass().

3.forName()方法加载,如Class.forName("java.lang.String");

获得了Class对象之后,就可以通过getAnnotation()获得注解,通过getMethods()获得方法,通过getConstructors()获得构造函数等,这为后续的反射代码铺平了道路.

本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5626078.html,如需转载请自行联系原作者

注意Class类的特殊性相关推荐

  1. 类设计者的工具(四):面向对象程序设计 (继承)

    本文为<C++ Primer>的读书笔记 目录 继承 基类 虚函数 动态绑定 (dynamic binding) 派生类 类派生列表 派生类的声明 继承的基类必须已经定义 继承基类中的虚函 ...

  2. 【Java 枚举 集合】枚举类Enum、映射EnumMap、集EnumSet

    枚举Enum.映射EnumMap.集EnumSet 一.枚举Enum 1.概述 2.介绍 ① valueOf ② values 3.分析 ※ 模仿一个枚举类 二.枚举映射 EnumMap 1.概述 2 ...

  3. 【万级并发】电商库存扣减如何设计?不超卖!

    随着中国消费认知的不断升级,网购走近千家万户,越来越被人们所接受.淘宝.唯品会.考拉.京东.拼多多等逐渐成为我们生活的重要组成部分. 除了常规的购物下单外,这些电商平台还经常搞一些双十一活动,秒杀.大 ...

  4. C++的iostream标准库介绍+使用详解(转)

    0 为什么需要iostream 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所 以讨论此标准库是有必要的,它与C语言的 stdio库不同,它从一开始就 ...

  5. 1号店11.11:分布式搜索引擎的架构实践

    http://www.uml.org.cn/zjjs/201512011.asp "11.11"是一年一度的电商盛宴,为了准备这个一年内最大规模的促销,1号店各条战线都在紧张有序地 ...

  6. C++的iostream标准库介绍

    C++的iostream标准库介绍 0 为什么需要iostream 1 iostream: istream 和 ostream 2 fstream: ifstream 和 ofstream 3 str ...

  7. 阿里java高级工程师面试100题(建议收藏)

    1,java堆,分新生代老年代,新生代有Eden,from surviver,to surviver三个空间,堆被所有线程共.eden内存不足时,发生一次minor GC,会把from survivo ...

  8. Java 异常处理学习总结

    Java 异常处理学习总结 -------------------------------------------------------------------------------------- ...

  9. css优先级计算规则

    2019独角兽企业重金招聘Python工程师标准>>> 最近面试了一些求职者,我问css优先级计算规则是怎样的?答曰ID优先级>class>元素选择器,外联样式优先级低于 ...

最新文章

  1. python3程序下载安装_程序猿的语言,Python 3.7.0下载安装
  2. k8s系列~mgr的应用
  3. javascript 深度克隆
  4. 剑指offer 算法 (递归与循环)
  5. IDEA突然自动关闭然后无法启动
  6. @namedqueries_在@NamedQueries中枚举@NamedQuery
  7. MaxCompute - ODPS重装上阵 第三弹 - 复杂类型
  8. oracle label security redition,今天在用11GR2客户端全库导出10GR2版本的数据库时报ORA-00904错误...
  9. php 多任务,PHP并行多任务研究(笔记)
  10. Word 2007书籍排版完全手册
  11. xz压缩文件的解压缩过程
  12. 我的游戏开发收藏夹 (不定期更新)
  13. the old reader使用分享
  14. DurIAN模型介绍
  15. 小心QQ信息中的网址传播维金Worm.Win32.Viking.ix/Worm.Viking.pg
  16. 计算机类大学生竞赛经验分享
  17. Pygame实战:据说这是史上最难扫雷游戏,没有之一,你们感受下......
  18. 机房重构一路走来——初步总结
  19. 顺序搜索小技巧-监视哨的作用
  20. java毕业设计项目选题基于SSM+JSP+MYSQL+H-UI 实现的校园食堂点餐|订餐系统

热门文章

  1. requests.get(url)执行没反应_如果贾府抄家时黛玉还活着,她会是什么反应?
  2. linux ubuntu文件系统,Ubuntu Linux文件系统的目录及用途简析
  3. pyqt tcp通信_实验十 基于PyQt界面的TCP通信程序(一).doc_学小易找答案
  4. 弹出层,div的写法
  5. 华为android8适配进度,华为 荣耀 O版本(Android 8.0)适配进度公告
  6. 子对象是什么java_面向对象编程(什么是对象)——java
  7. 手语识别 机器学习_机器学习入门实践,让机器识别一只猫
  8. 基于CSDN完成TEASOFT的MOOC编辑整理
  9. 通过一个函数对比 mgrid以及meshgrid函数
  10. 2021春季学期-创新设计与实践-Lesson3