Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。 这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。

一、类定义

public final class Class<T> implements java.io.Serializable,GenericDeclaration,Type,AnnotatedElement {}
  • Serializable:可被序列化的标志接口
  • GenericDeclaration:可以声明(定义)范型变量
  • Type:声明用的表示这是一个表示Type的东西
  • AnnotatedElement:表了在当前JVM中的一个“被注解元素”

二、常用方法

Class类没有公共的构造方法,无法通过new运算符实例化;只能通过对象的getClass方法,或是通过Class.forName(…)来获得实例。

1、getName()

一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

    public String getName() {String name = this.name;if (name == null)this.name = name = getName0();return name;}// cache the name to reduce the number of calls into the VMprivate transient String name;private native String getName0();

2、newInstance()

可以为类创建一个实例

@CallerSensitive
public T newInstance()throws InstantiationException, IllegalAccessException
{if (System.getSecurityManager() != null) {checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), false);}// NOTE: the following code may not be strictly correct under// the current Java memory model.// Constructor lookupif (cachedConstructor == null) {if (this == Class.class) {throw new IllegalAccessException("Can not call newInstance() on the Class for java.lang.Class");}try {Class<?>[] empty = {};final Constructor<T> c = getConstructor0(empty, Member.DECLARED);// Disable accessibility checks on the constructor// since we have to do the security check here anyway// (the stack depth is wrong for the Constructor's// security check to work)java.security.AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() {public Void run() {c.setAccessible(true);return null;}});cachedConstructor = c;} catch (NoSuchMethodException e) {throw (InstantiationException)new InstantiationException(getName()).initCause(e);}}Constructor<T> tmpConstructor = cachedConstructor;// Security check (same as in java.lang.reflect.Constructor)int modifiers = tmpConstructor.getModifiers();if (!Reflection.quickCheckMemberAccess(this, modifiers)) {Class<?> caller = Reflection.getCallerClass();if (newInstanceCallerCache != caller) {Reflection.ensureMemberAccess(caller, this, null, modifiers);newInstanceCallerCache = caller;}}// Run constructortry {return tmpConstructor.newInstance((Object[])null);} catch (InvocationTargetException e) {Unsafe.getUnsafe().throwException(e.getTargetException());// Not reachedreturn null;}
}
private volatile transient Constructor<T> cachedConstructor;
private volatile transient Class<?>       newInstanceCallerCache;

3、getClassLoader()

返回该类的类加载器。

@CallerSensitive
public ClassLoader getClassLoader() {ClassLoader cl = getClassLoader0();if (cl == null)return null;SecurityManager sm = System.getSecurityManager();if (sm != null) {ClassLoader.checkClassLoaderPermission(cl, Reflection.getCallerClass());}return cl;

4、getComponentType()

返回表示数组组件类型的 Class。

public native Class<?> getComponentType();

5、getSuperclass()

返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。

public native Class<? super T> getSuperclass();

6、isArray()

判定此 Class 对象是否表示一个数组类。

public native boolean isArray();

7、getSimpleName()

返回源代码中给出的基础类的简称。string

public String getSimpleName() {if (isArray())return getComponentType().getSimpleName()+"[]";String simpleName = getSimpleBinaryName();if (simpleName == null) { // top level classsimpleName = getName();return simpleName.substring(simpleName.lastIndexOf(".")+1); // strip the package name}int length = simpleName.length();if (length < 1 || simpleName.charAt(0) != '$')throw new InternalError("Malformed class name");int index = 1;while (index < length && isAsciiDigit(simpleName.charAt(index)))index++;// Eventually, this is the empty string iff this is an anonymous classreturn simpleName.substring(index);
}

8、getDeclaredFields()

返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。

@CallerSensitive
public Field[] getDeclaredFields() throws SecurityException {checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);return copyFields(privateGetDeclaredFields(false));
}

java.lang.reflect.Field主要是用于反射类的字段。反射经常用于工具类的开发,或中间件的开发。

三、总结

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。
虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否 所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象。
每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。

JDK源码解析之 java.lang.Class相关推荐

  1. JDK源码解析之 java.lang.Exception

    异常.是所有异常的基类,用于标识一般的程序运行问题.这些问题通常描述一些会被应用程序捕获的反常情况. 一.源码部分 //继承了java.lang.Throwable public class Exce ...

  2. JDK源码解析之 java.lang.Error

    java.lang.Error 错误.是所有错误的基类,用于标识严重的程序运行问题.这些问题通常描述一些不应被应用程序捕获的反常情况. 一.源码部分 //继承了java.lang.Throwable ...

  3. JDK源码解析之 java.lang.Thread

    位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知识:线程的几种状态.上下文切换 ...

  4. JDK源码解析之 java.lang.Integer

    teger 基本数据类型int 的包装类 Integer 类型的对象包含一个 int 类型的字段 一.类定义 public final class Integer extends Number imp ...

  5. JDK源码解析之 Java.lang.Object

    Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起.作为其他所有类的基类,Object具有哪些属性和行为,是Java语言设计背后的思维体现. Object类位于ja ...

  6. JDK源码解析之 Java.lang.Compiler

    Compiler类提供支持Java到本机代码编译器和相关服务.在设计上,它作为一个占位符在JIT编译器实现. 一.源码部分 public final class Compiler {private C ...

  7. JDK源码解析之 Java.lang.Byte

    byte,即字节,由8位的二进制组成.在Java中,byte类型的数据是8位带符号的二进制数,以二进制补码表示的整数 取值范围:默认值为0,最小值为-128(-27);最大值是127(27-1) By ...

  8. JDK源码解析之 Java.lang.String

    String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串.因 ...

  9. JDK源码解析之 Java.lang.Package

    如果我们在Class对象上调用getPackage方法,就可以得到描述该类所在包的Package对象(Package类是在java.lang中定义的).我们也可以用包名通过调用静态方法getPacka ...

  10. JDK源码解析之 java.lang.System

    一个和系统环境进行交互的类. System不允许被实例化, 而且是一个final类 一.不能实例化 private System() {} 二.成员变量 public final static Inp ...

最新文章

  1. POJ 3414 Pots【广搜】
  2. 【s操作】手机移动数据网络问题初级解决方案,论手机运营商网络状况
  3. 智能指针——weak_ptr
  4. Map Reduce和流处理
  5. mac os qt项目编译_【Qt开发】第一个Qt程序Hello World!
  6. vmware克隆linux虚拟机网卡无法上网的解决办法
  7. 使用volatile关键字的场景
  8. struts的比较标签,在使用时,与测试时需要留心。
  9. 怎么选PMP培训机构?
  10. EXCEL快速合并同类项
  11. 增值税发票查验平台网站时被拦截了怎么办?
  12. iOS 14上全面屏iPhone的状态栏高度
  13. 这么有“艾”的端午节,此处应@博物杂志!
  14. 输入手机号查询信息C语言,简单个人电话号码查询系统.doc
  15. 常用的系统操作响应时间
  16. Fastdata极数:2019年中国即时配送行业发展分析报告
  17. 【人生杂谈】 - 金钱/名利 贫穷/富贵 健身房定律
  18. 肠胃不好吃什么调理?
  19. H5中需要掌握的 ANIMATION 动画效果
  20. 北京内推 | 智源人工智能研究院数据智能组招聘全职研究员/算法工程师

热门文章

  1. qt将光标相对于桌面的位置转换为相对于窗口的位置
  2. C/C++ putchar函数 - C语言零基础入门教程
  3. matlab实验函数编写与程序设计,matlab实验四函数编写与程序设计
  4. php上传商品信息并显示,第37课 thinkphp5添加商品基本信息及通过前置钩子上传商品主图 模型事件(勾子函数)...
  5. c语言字符型计算器,求用c语言编程四则混合运算计算器?
  6. php 有子目录,php列出目录中所有子目录的实现代码
  7. vmware linux ens32,修改Centos7的网卡ens32 改为eth0
  8. a33 linux内核启动网卡,a33核心板启动问题 - nevermore1981的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. python3 for sum_Python for循环和“sum13”方法
  10. mysql dump工具升级_MySQL数据库升级