一、概述

Class的实例代表着正在运行的Java应用程序的类和接口。枚举是一种类,而直接是一种接口。每一个数组也属于一个类,这个类b被反射为具有相同元素类型和维数的所有数组共享的类对象。八大基本树类型和void关键字也都有属于自己的类对象。

Class没有public的构造器,由JVM虚拟机调用类加载器中的defineClass方法来构造。

二、代码剖析

类定义:

public final class Class<T> implements java.io.Serializable,GenericDeclaration,Type,AnnotatedElement

构造方法:这是一个有参的私有构造,只能有2JVM虚拟机在创建对象时使用,这个构造可以防止默认的无参构造被使用。

    private Class(ClassLoader loader) {classLoader = loader;}

toString方法:会打印一个Class是类还是接口,以及它的名字。

    public String toString() {return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))+ getName();}

toGenericString():jdk1.8新增方法,返回包含修饰符和参数在内的类信息。

    public String toGenericString() {if (isPrimitive()) {return toString();} else {StringBuilder sb = new StringBuilder();// Class modifiers are a superset of interface modifiersint modifiers = getModifiers() & Modifier.classModifiers();if (modifiers != 0) {sb.append(Modifier.toString(modifiers));sb.append(' ');}if (isAnnotation()) {sb.append('@');}if (isInterface()) { // Note: all annotation types are interfacessb.append("interface");} else {if (isEnum())sb.append("enum");elsesb.append("class");}sb.append(' ');sb.append(getName());TypeVariable<?>[] typeparms = getTypeParameters();if (typeparms.length > 0) {boolean first = true;sb.append('<');for(TypeVariable<?> typeparm: typeparms) {if (!first)sb.append(',');sb.append(typeparm.getTypeName());first = false;}sb.append('>');}return sb.toString();}}

public static Class<?> forName(String className)

通过类或接口的名字获取对应的Class对象。

forName(className,true, this.getClass().getClassLoader()):

Class.forName(className)实际上是调用Class.forName(className,true, this.getClass().getClassLoader())。第二个参数,是指Class被loading后是不是必须被初始化。最终都调用了native方法去实现。

public T newInstance() throws InstantiationException, IllegalAccessException

为类创建一个类实例,这个方法用的比较多。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。

public native boolean isArray():判断对象是否为数组,由native实现。

public native boolean isPrimitive():判断是否基本数据类型。

isSynthetic():当且仅当这个类是Java语言规范定义的一种合成类此方法返回true。synthetic总的来说,是由编译器引入的字段、方法、类或其他结构,主要用于JVM内部使用。有关合成类请参考:https://blog.csdn.net/a327369238/article/details/52608805。

public ClassLoader getClassLoader():返回类加载器。

接着有一大堆的get方法,可以获取类型参数,父类,泛型父类,包,接口们,泛型接口们,方法,属性等各种各样可用于反射的方法。

三、总结

最后用最简单的描述来区分new关键字和newInstance()方法的区别:

  1. newInstance: 弱类型。低效率。只能调用无参构造。
  2. new: 强类型。相对高效。能调用任何public构造。

JDK源码(15)-Class相关推荐

  1. java调用clang编译的so_写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实

    好奇害死羊 很多小伙伴们做Java开发,天天写Java代码,肯定离不开Java基础环境:JDK,毕竟我们写好的Java代码也是跑在JVM虚拟机上. 一般来说,我们学Java之前,第一步就是安装JDK环 ...

  2. java int类源码,一起学JDK源码 -- Integer类

    Integer类为java基本类型int的包装类,除了前面提到的Byte类,Short类中的大部分方法,Integer类中还提供了很多处理int类型的方法,接下来就让我们一起看看吧. 基础知识: 1. ...

  3. 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach

    一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 代 ...

  4. 【JDK】JDK源码分析-HashMap(1)

    概述 HashMap 是 Java 开发中最常用的容器类之一,也是面试的常客.它其实就是前文「数据结构与算法笔记(二)」中「散列表」的实现,处理散列冲突用的是"链表法",并且在 J ...

  5. 【JDK源码】java.io包常用类详解

    看完java.io的JDK源码,在网上发现一篇关于java.io中的类使用的文章总结的很全面,看完之后在原文的基础上加了一些自己的总结如下构成了本篇文章.原文地址 一.Java Io流 1. Java ...

  6. JDK源码学习路线~每天学一点~每天进步一点点

    很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起.以下为小编整理的通常所需阅读的源码范围. 标题为包名,后面序号为优先级1-4,优先级递减 1.java.lang 1) Objec ...

  7. 一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate

    一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点 ...

  8. JDK源码笔记-java.util.HashMap

    2019独角兽企业重金招聘Python工程师标准>>> HashMap 的存储实现 当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片段为例: Java代 ...

  9. 一点一点看JDK源码(二)java.util.List

    一点一点看JDK源码(二)java.util.List liuyuhang原创,未经允许进制转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 List译为表,一览表, ...

  10. 从JDK源码角度看Short

    概况 Java的Short类主要的作用就是对基本类型short进行封装,提供了一些处理short类型的方法,比如short到String类型的转换方法或String类型到short类型的转换方法,当然 ...

最新文章

  1. spinner 下拉框控件
  2. Sql Server 日期格式转换
  3. webpack常用命令总结
  4. AI修复技术为何这么强?原来背后的技术是……
  5. php 采集百度,PHP抓取百度内容有哪些方法
  6. python下面的代码_求下面python代码的差别。
  7. 6 云计算系列之Nova安装与配置
  8. android利用AudioRecord实现录音功能(kotlin语言)
  9. 多页Excel转换成PDF时如何保存为单独文件
  10. 拓端tecdat|R语言中使用多重聚合预测算法(MAPA)进行时间序列分析
  11. ubuntu 18.04使用aqt安装QT5.12
  12. Cydia 不能联网的终极解决方法
  13. vue3 - composition api
  14. Linux 编程 —— libstdc++.so.6: version `CXXABI_1.3.11‘ not found
  15. 主干开发(Trunk-based development)
  16. 简单粗暴理解与实现机器学习之K-近邻算法(三):距离度量、欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化距离、余弦距离、汉明距离、杰卡德距离、马氏距离
  17. 前端学习周报(第一周)
  18. 微信小程序商城搭建二手交易网站购物+后台管理系统|前后分离VUE.js
  19. 手写识别ocr java,怎么识别手写文字?迅捷OCR文字识别软件帮你快速完成!
  20. CorelDRAW插件-GMS开发-VBA注册-机器码-CDR(八)

热门文章

  1. 《BI那点儿事》数据流转换——派生列
  2. 【redis源码】(九)Redis
  3. 大规模分布式系统资源管理(二)
  4. Dubbo思维导图知识点整理
  5. 跨越原理优缺点_请教:单管跨越式和双管式的优缺点
  6. 参加管理课程所获的 之一
  7. golang,接口的demo01
  8. python爬虫07--代理
  9. PHP 获取服务器详细信息
  10. java $表示什么_java – 变量名中$的含义是什么?