反射复习
反射
一.反射是什么?反射是框架设计的灵魂
- 先了解一下什么是动态语言(是一类在运行时可以改变其结构的语言)。静态语言(运行时结构不可变的语言就是静态语言)
Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期间借助Reflection API取得任何类的内部信息。- JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。反射就是把java类中的各种成分映射成一个个的Java对象例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
- 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.


二.反射的好处:
- 可以在程序运行过程中,操作这些对象
- 可以解耦,提高程序的可扩展性
三.Class类的使用
Class类的实例表示正在运行的Java应用程序中的类和接口。枚举是一种类,一个注释是一种界面。每个数组也属于一个类,它被反映为具有相同元素类型和维数的所有数组共享的Class对象。原始Java类型( boolean , byte , char , short , int , long , float ,和double ),以及关键字void也表示为Class对象。
Class没有公共建设者。 相反, Class对象由Java虚拟机自动构建,因为类已加载,并通过调用类加载器中的defineClass方法。
<1>Class类实例的获取

1 | package com.company; |
输出结果如下:
1 | 学生 |
==注意:在运行期间,一个字节码文件(.class)只会加载一次,不论使用哪一种方式获取的Class对象都是同一个,只有一个Class对象产生。==
三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。
所有类型的Class对象
1 | package com.company; |
输出结果:
1 | class java.lang.Object |
<2>Class类的常用方法

==获取功能:==
1.获取成员变量们
FieldgetField(String name)返回一个 Field对象,该对象反映由该Class对象表示的类或接口的指定公共成员字段。Field[]getFields()返回一个包含 Field对象的数组,Field对象反映由该Class对象表示的类或接口的所有可访问的公共字段。
FieldgetDeclaredField(String name)返回一个 Field对象,该对象反映由该Class对象表示的类或接口的指定声明字段。Field[]getDeclaredFields()返回一个 Field对象的数组,反映了由该Class对象表示的类或接口声明的所有字段。
1 | package com.company; |
获取到了成员变量,我们能做什么呢?
*设置值set *获取值get
void set(Object obj, Object value) 将指定的对象参数中由此 Field对象表示的字段设置为指定的新值。 Objectget(Object obj)返回由该 Field表示的字段在指定对象上的值。
1 | package com.company; |
2.获取构造方法们
ConstructorgetConstructor(Class... parameterTypes)返回一个 Constructor对象,该对象反映由该Class对象表示的类的指定公共构造函数。Constructor[]getConstructors()返回一个包含 Constructor对象的数组,Constructor对象反映了由该Class对象表示的类的所有公共构造函数。
ConstructorgetDeclaredConstructor(Class... parameterTypes)返回一个 Constructor对象,该对象反映由此Class对象表示的类或接口的指定构造函数。Constructor[]getDeclaredConstructors()返回反映由该 Class对象表示的类声明的所有构造函数的Constructor对象的数组。
1 | package com.company; |
获取完构造函数后能干嘛呢?当然创建对象了!
TnewInstance(Object... initargs)使用由此 Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。
1 | package com.company; |
3.获取成员方法们
方法getMethod(String name, Class... parameterTypes)返回一个 方法对象,该对象反映由该Class对象表示的类或接口的指定公共成员方法。方法[]getMethods()返回一个包含 方法对象的数组,方法对象反映由该Class对象表示的类或接口的所有公共方法,包括由类或接口声明的对象以及从超类和超级接口继承的类。方法getDeclaredMethod(String name, Class... parameterTypes)返回一个 方法对象,它反映此表示的类或接口的指定声明的方法Class对象。方法[]getDeclaredMethods()返回一个包含 方法对象的数组,方法对象反映由Class对象表示的类或接口的所有声明方法,包括public,protected,default(package)访问和私有方法,但不包括继承方法。
Method类的方法
Objectinvoke(Object obj, Object... args)在具有指定参数的指定对象上调用此 方法对象表示的基础方法。
1 | package com.company; |
4.获取类名
StringgetName()返回由该 Class对象表示的实体(类,接口,数组类,原始类型或无效)的Class,作为String。StringgetPackageName()返回完全限定的包名称。
1 | package com.company; |