JAVA【反射】详解:
反射概述
JAVA反射机制是在"运行的时候",对于任意一个类,都能够知道这个类的所有方法和属性;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
简单来讲,反射是指对于任何一个Class类,在"运行的时候"都可以直接得到这个类全部成分。
在运行时,可以直接得到这个类的构造器对象:Constructor
在运行时,可以直接得到这个类的成员变量对象:Field
在运行时,可以直接得到这个类的成员方法对象:Method
图源:https://pdai.tech
反射获取类对象
反射的第一步都是先得到编译后的Class类对象,然后就可以得到Class的全部成分。
方法一(Class类中的静态方法:forname)
方法二(类名.class)、方法三(对象.getClass() )
反射获取构造器对象
返回所有构造器对象数组只能拿public
定位单个构造器
按照参数定位一个无参构造器
定位某个有参构造器
结果
暴力反射,破坏封装性,然后创建对象newInstance
.setAccessible(ture);
有参创建对象newInstance
反射获取成员变量
定位全部成员变量并遍历
可见常量也是成员变量
赋值
取值
使用反射技术获取方法并使用
提取全部方法并遍历
获取单个方法
执行m无参方法
然后再执行m2有参方法
getName、getCanonicalName与getSimpleName的区别
- getSimpleName:只获取类名
- getName:类的全限定名,jvm中Class的表示,可以用于动态加载Class对象,例如Class.forName。
- getCanonicalName:返回更容易理解的表示,主要用于输出(toString)或log打印,大多数情况下和getName一样,但是在内部类、数组等类型的表示形式就不同了。