Java 反射 Class类

@author ixenos

摘要:Class类在反射中的地位、构造Class对象的三种方式、Class对象构造对应类型对象的三种方式

Class类在反射中的地位

位于java.lang下的Class类是位于java.lang.reflect下的Constructor类、Method类、Field类和Array类的入口类

-Class类  代表一个类

-Field类  代表类的成员变量(也成为类的属性、域)

-Array类  提供了动态创建数组、以及访问数组元素的静态方法

-Method类  代表类的方法

-Constructor类  代表类的构造方法

构造Class对象的三种方式

0.前言:

为了使用类而做的准备工作包括三个步骤:

1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class对象

2)链接:验证字节码,为静态域(只是static修饰的域,不包含static final )分配存储空间,解析此类对其他类的所有引用

3)初始化:若该类有超类,对其初始化,执行静态初始化器和静态初始化块。这是对类的初始化

-----------------------------

***static final int = 47 是编译期常量,不需要对类进行初始化就可以读取

***static final int = Random.nextInt(100)  是运行时常量,这种一般要在对象创建后才会运行,超过初始化的阶段了!

***static int = 47 是非常数的静态域,不是常量,更不是编译期常量,链接阶段只分配存储空间,初始化阶段才初始化

1.Class类的forName静态方法(自动初始化)

只知道对应类型名时,使用Class.forName(String name) 动态生成Class对象,name是完全限定名

forNamepublic static Class>forName(String className)throwsClassNotFoundException

返回与带有给定字符串名的类或接口相关联的 Class 对象。调用此方法等效于:

Class.forName(className,true, currentLoader)

其中 currentLoader 表示当前类的定义类加载器。

例如,以下代码片段返回命名为 java.lang.Thread 的类的运行时 Class 描述符。

Class t= Class.forName("java.lang.Thread")

调用 forName("X") 将导致命名为 X 的类被初始化。

参数:

className-所需类的完全限定名。

返回:

具有指定名的类的 Class 对象。

抛出:

LinkageError-如果链接失败

ExceptionInInitializerError-如果此方法所激发的初始化失败

ClassNotFoundException- 如果无法定位该类

API文档描述

2.Object类对象自带getClass方法(已经初始化)

通过已经存在的对象,即持有对应类型对象的引用时,使用对象的getClass()(属于根类Object的一部分),如new Integer(1).getClass()将返回Integer.class,而此时的类型对象也必定是在运行中了,所以已经初始化

3.使用类字面常量(不会自动初始化)

例如 Fancy.class、String.class、Integer.TYPE

1)类字面常量应用于:普通类(包含包装类哟)、接口、数组、基本数据类型

***基本数据类型 使用标准字段TYPE,这是个指向基本数据类型的Class对象的引用

***例如int.class等价于Integer.TYPE,但是不等价于Integer.class

2)使用".class"来创建Class对象的引用时,不会自动地初始化该Class对象。

那为什么不会自动初始化呢?由补充内容可知初始化被延迟到了对静态(static)方法(构造器等同于隐式静态)或者非常数(final)静态域进行首次引用时才执行,而引用类字面常量在运行时只是到了加载和链接的阶段

Class对象构造对应类型对象的三种方式

无参构造

1.Class对象的newInstance方法(不能传递参数)

先获得Class对象,然后通过Class对象的newInstance方法直接生成

1 Class> classType = String.class;2 Object obj = classType.newInstance();

newInstancepublicT newInstance()throwsInstantiationException,

IllegalAccessException创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的new表达式实例化该类。如果该类尚未初始化,则初始化这个类。

注意,此方法传播null构造方法所抛出的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译时的异常检查,而在其他情况下编译器都会执行该检查。 Constructor.newInstance 方法将该构造方法所抛出的任何异常包装在一个(已检查的)InvocationTargetException 中,从而避免了这一问题。

返回:

此对象所表示的类的一个新分配的实例。

抛出:

IllegalAccessException- 如果该类或其 null构造方法是不可访问的。

InstantiationException- 如果此 Class 表示一个抽象类、接口、数组类、基本类型或 void; 或者该类没有 null构造方法; 或者由于其他某种原因导致实例化失败。

ExceptionInInitializerError-如果该方法引发的初始化失败。

SecurityException-如果存在安全管理器 s,并满足下列任一条件:

调用 s.checkMemberAccess(this, Member.PUBLIC) 拒绝创建该类的新实例

调用者的类加载器不同于也不是当前类的类加载器的一个祖先,并且对 s.checkPackageAccess() 的调用拒绝访问该类的包

API文档描述

2.Contructor对象的newInstance方法(不填参数就和1.一样)

先获得Class对象,然后通过Class对象生成Constructor对象,通过Constructor对象的newInstance方法生成

1 Class> classType = Customer.class;2 //Class[]数组对应形参类型、个数,这里为空

3 Constructor cons = classType.getConstructor(newClass[]{});4 //Object[]数组对应传入的实参的类型、个数,这里为空

5 Object obj = cons.newInstance(new Object[]{});

getConstructorpublic Constructor getConstructor(Class>... parameterTypes)throwsNoSuchMethodException,

SecurityException返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。parameterTypes 参数是 Class 对象的一个数组,这些 Class 对象按声明顺序标识构造方法的形参类型。 如果此 Class 对象表示非静态上下文中声明的内部类,则形参类型作为第一个参数包括显示封闭的实例。

要反映的构造方法是此 Class 对象所表示的类的公共构造方法,其形参类型与 parameterTypes 所指定的参数类型相匹配。

参数:

parameterTypes-参数数组

返回:

与指定的 parameterTypes 相匹配的公共构造方法的 Constructor 对象

抛出:

NoSuchMethodException-如果找不到匹配的方法。

SecurityException-如果存在安全管理器 s,并满足下列任一条件:

调用 s.checkMemberAccess(this, Member.PUBLIC) 拒绝访问构造方法

调用者的类加载器不同于也不是当前类的类加载器的一个祖先,并且对 s.checkPackageAccess() 的调用拒绝访问该类的包

从以下版本开始:

JDK1.1

API-getConstructor

newInstancepublicT newInstance(Object... initargs)throwsInstantiationException,

IllegalAccessException,

IllegalArgumentException,

InvocationTargetException使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。个别参数会自动解包,以匹配基本形参,必要时,基本参数和引用参数都要进行方法调用转换。

如果底层构造方法所需形参数为0,则所提供的 initargs 数组的长度可能为 0 或 null。

如果构造方法的声明类是非静态上下文的内部类,则构造方法的第一个参数需要是封闭实例;请参阅Java 语言规范 第15.9.3节。

如果所需的访问检查和参数检查获得成功并且实例化继续进行,这时构造方法的声明类尚未初始化,则初始化这个类。

如果构造方法正常完成,则返回新创建且已初始化的实例。

参数:

initargs- 将作为变量传递给构造方法调用的对象数组;基本类型的值被包装在适当类型的包装器对象(如 Float 中的 float)中。

返回:

通过调用此对象表示的构造方法来创建的新对象

抛出:

IllegalAccessException-如果此 Constructor 对象实施 Java 语言访问控制并且底层构造方法是不可访问的。

IllegalArgumentException-如果实参和形参的数量不同;如果基本参数的解包转换失败;如果在可能的解包后,无法通过方法调用转换将参数值转换为相应的形参类型;如果此构造方法属于枚举类型。

InstantiationException-如果声明底层构造方法的类表示抽象类。

InvocationTargetException-如果底层构造方法抛出异常。

ExceptionInInitializerError- 如果此方法引发的初始化失败。

API-Cons-newInstance

含参构造

3.Contructor对象的newInstance方法(填入形参类型和实际参数)

先获得Class对象,然后通过Class对象生成Constructor对象,通过Constructor对象的newInstance方法生成

1 Class> classType = Customer.class;2 //Class[]数组对应形参类型、个数,这里为Integer.TYPE,Xenos.class,String.class

3 Constructor cons = classType.getConstructor(new Class[]{Integer.TYPE, Xenos.class, String.class});4 //Object[]数组对应传入的实参的类型、个数,这里为1, new Xenos(), "Think"

5 Object obj = cons.newInstance(new Object[]{1, new Xenos(), "Think"});

java 反射 本类_Java 反射 Class类相关推荐

  1. java反射 获取方法_java反射之获取类的信息方法(推荐)

    本文接上文"老生常谈反射之class类的使用(必看篇)",以编写一个用来获取类的信息(成员函数.成员变量.构造函数)的工具类来讲解"反射之获取类的信息" 1.获 ...

  2. java.lang.class对象_Java反射——java.lang.Class 类简介

    Java的基本思想之一是万事万物即对象,类也是一种对象.但是类是什么对象呢?Java中的类是java.lang.Class的实例化对象,这被成为类类型. //java.lang.Class类中的的主要 ...

  3. java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点

    关注程序员7歌,一起用技术改变世界 大家好,我是程序员7歌,今天我为大家讲解Java的反射机制. 首先我们来看看反射的概念: Java反射说的就是在程序运行中,任何一个类,我们都可以知道这个类的方法和 ...

  4. java反射三种_Java反射

    1.反射获取Class对象的三种方式 反编译 不是自己写的类,也不知道类里面有哪些方法 变量,让你能够使用程序上线了,修改程序但不终止程序的运行--反射 (1)Object类 getClass 方法 ...

  5. java反射重要么_JAVA反射----这些知识你需要知道

    前言: 在学习JAVA的反射之前我觉得很有必要花几分钟时间了解一下JVM的内存结构.如果一开始就说什么是反射,以及反射的API.这样做是很难真正的理解反射的. JVM是JAVA跨平台的核心,其结构为上 ...

  6. java反射的运用_java反射的使用

    java反射的使用 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力. JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...

  7. java技术详解_Java反射技术详解及实例解析

    前言 相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替 ...

  8. java反射随意值_Java反射笔记

    Java反射 反射库提供了一个丰富且精巧的工具集,可以用来编写能够动态操纵Java代码的程序.能够分析类能力的程序称为反射(reflective).反射机制的功能极为强大,反射机制可以用来: 在运行时 ...

  9. 反射在java中的应用_java反射机制在项目中的运用

    定义:Reflection是java开发语言特性之一,它允许运行中的java程序对自身进行检测,自审,并能操作程序内部的属性和方法,Reflection是java被视为动态语言关键之一.允许程序从执行 ...

最新文章

  1. RSA加密的填充模式
  2. Sbo通用数据选择功能的实现
  3. ws5102怎么设置虚拟服务器,【华为路由器WS5102怎么设置开双频】规格参数|限速|APP|配置|功耗_摘要频道_什么值得买...
  4. java替换图片中文字_Java 添加、替换、删除Word中的图片
  5. 一维数组反转c语言_C语言实现数组的循环左移,右移,翻转的示例
  6. .Net开源源码查询
  7. 计算机电源在线工作,计算机开关电源的工作原理与维修2.pdf
  8. MODIS数据下载及图像处理教程
  9. 香农编码,哈夫曼编码与费诺编码的比较
  10. 微信小程序下拉刷新组件加载图片(三个小点)不显示的问题
  11. nexus私服npm包踩坑记录
  12. MS8413光纤同轴解码芯片
  13. C1认证学习二十六(基础选择器)
  14. 无线打印服务器与什么打印机相配,网络打印服务器-本地打印机和网络打印机有什么区别? 爱问知识人...
  15. 一份超详细的网站推广优化方案 1
  16. 文件md5加密基本操作
  17. 程序员的奋斗史(四十)——大学断代史(四)——我与博客
  18. 【智能优化算法-热交换算法】基于热交换优化算法求解多目标优化问题附matlab代码
  19. R语言使用table函数统计dataframe数据中的离散变量(分类变量、因子变量)数据列的每一种水平的统计计数
  20. stm32毕业设计 单片机MP3音乐播放器

热门文章

  1. 玩转SpringBoot 2 之项目启动篇
  2. 将Eclipse Android项目打包成APK文件
  3. 基于JAVA+SpringMVC+Mybatis+MYSQL的旅游景点酒店预订网站设计
  4. 【转】横向扩展与纵向扩展
  5. 1029 最大公约数和最小公倍数问题(gcd) luogu洛谷
  6. Node 环境变量 process.env.NODE_ENV 之webpack应用
  7. Oracle存储过程游标for循环怎么写
  8. spring事务传播,隔离级别,
  9. 2016级算法期末上机-H.难题·AlvinZH's Fight with DDLs III
  10. Android UI:机智的远程动态更新策略