Java反射机制

API:

内容:

  1. 反射基础+反射基本流程
  2. 反射可访问的常用信息
  3. 通过反射访问的构造方法的使用
  4. 通过反射访问的方法的使用
  5. 通过反射访问的方法的使用
  6. 无耻的反射小demo

注:2.3.4.5 都是一些方法的例举,归纳,可跳过。

1.反射基础

Java 反射机制主要提供了以下功能,这些功能都位于java.lang.reflect包。

  • 运行时判断任意一个对象所属的类。
  • 运行时构造任意一个类的对象。
  • 运行时判断任意一个类所具有的成员变量和方法。
  • 运行时调用任意一个对象的方法。
  • 生成动态代理
  • 可以获取对象的私有属性、调用对象的私有方法

反射使用基本步骤:

  • 获取类对应的Class对象
  • 使用Class对象获取指定构造方法对象Constructor、方法对象Method、成员对象Filed
  • 使用ConstructorMethodFiled的实例对象构造类的对象、调用类的方法、访问/修改类的属性
  1. 获取类的Class对象:
  • Class.forName(ClassName)
  • 类名.class
  • 对象.getCalss()
  1. ConstructorMethodField的获取:
  • getXXXs():获取此Class对象表示的公有XXX组成的数组
  • getXXX(...):根据参数获取此Class对象表示的公有XXX
  • getDeclareXXXs():获取此Class对象表示的所有XXX组成的数组
  • getDeclareXXX(...):获取此Class对象表示的所有XXX

其中:XXX表示ConstructorMethodField;如果是获取(构造)方法,则参数为(构造)方法参数类型的Class对象,如果是成员变量,则参数就是成员变量名。

  1. ConstructorMethodField的使用(这里只是一个常用的使用举例,还有很多使用见下表)
  • constructor .newInstance(...):构造一个此Class对象的实例
  • method.invoke(Object obj , Object...args):调用obj对象的method方法,传入参数 args(可以为空)
  • field.get(Object obj)/set(Object obj, Object value):获取obj对象的filed值或设置obj对象的filed值为value

2. 反射可访问的常用信息

类型 访问方法 返回值类型 说明
包路径 getPackage() Package 对象 获取该类的存放路径
类名称 getName() String 对象 获取该类的名称
继承类 getSuperclass() Class 对象 获取该类继承的类
实现接口 getlnterfaces() Class 型数组 获取该类实现的所有接口
构造方法 getConstructors() Constructor 型数组 获取所有权限为 public 的构造方法
构造方法 getDeclaredContxuectors() Constructor 对象 获取当前对象的所有构造方法
方法 getMethods() Methods 型数组 获取所有权限为 public 的方法
方法 getDeclaredMethods() Methods 对象 获取当前对象的所有方法
成员变量 getFields() Field 型数组 获取所有权限为 public 的成员变量
成员变量 getDeclareFileds() Field 对象 获取当前对象的所有成员变量
内部类 getClasses() Class 型数组 获取所有权限为 public 的内部类
内部类 getDeclaredClasses() Class 型数组 获取所有内部类
内部类的声明类 getDeclaringClass() Class 对象 如果该类为内部类,则返回它的成员类,否则返回 null

如上表所示,在调用 getFields() 和 getMethods() 方法时将会依次获取权限为 public 的字段和变量,然后将包含从超类中继承到的成员实量和方法。而通过 getDeclareFields() 和 getDeclareMethod()只是获取在本类中定义的成员变量和方法。

3.通过反射访问的构造方法的使用

为了能够动态获取对象构造方法的信息,首先需要通过下列方法之一创建一个Constructor类型的对象或者数组。

方法名 说明
getConstructors() 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法
getConstructor(Class<?>…parameterTypes) 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法
getDeclaredConstructors() 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法
getDeclaredConstructor(Class<?>...parameterTypes) 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法

其中:参数的作用是指定列选,为需要反射获取的类的 类型的Class对象如:类型.class

Constructor类的常用方法:

方法名称 说明
isVarArgs() 查看该构造方法是否允许带可变数量的参数,如果允许,返回 true,否则返回false
getParameterTypes() 按照声明顺序以 Class 数组的形式获取该构造方法各个参数的类型
getExceptionTypes() 以 Class 数组的形式获取该构造方法可能抛出的异常类型
newInstance(Object … initargs) 通过该构造方法利用指定参数创建一个该类型的对象,如果未设置参数则表示采用默认无参的构造方法
setAccessiable(boolean flag) 如果该构造方法的权限为 private,默认为不允许通过反射利用 netlnstance()方法创建对象。如果先执行该方法,并将入口参数设置为 true,则允许创建对象
getModifiers() 获得可以解析出该构造方法所采用修饰符的整数

通过 java.lang.reflect.Modifier 类可以解析出 getMocMers() 方法的返回值所表示的修饰符信息。在该类中提供了一系列用来解析的静态方法,既可以查看是否被指定的修饰符修饰,还可以字符串的形式获得所有修饰符。
Modifier类的常用方法

静态方法名称 说明
isStatic(int mod) 如果使用 static 修饰符修饰则返回 true,否则返回 false
isPublic(int mod) 如果使用 public 修饰符修饰则返回 true,否则返回 false
isProtected(int mod) 如果使用 protected 修饰符修饰则返回 true,否则返回 false
isPrivate(int mod) 如果使用 private 修饰符修饰则返回 true,否则返回 false
isFinal(int mod) 如果使用 final 修饰符修饰则返回 true,否则返回 false
toString(int mod) 以字符串形式返回所有修饰符

4.通过反射访问的方法的使用

和Constructor类似:要动态获取一个对象方法的信息,首先需要通过下列方法之一创建一个 Method 类型的对象或者数组。

方法名 说明
getMethod s() 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共方法
getMethod (Class<?>…parameterTypes) 返回一个 Method 对象,它反映此 Class 对象所表示的类的指定公共方法
getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有方法
getDeclaredMethod (Class<?>...parameterTypes) 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定方法

Method类的常用方法:

静态方法名称 说明
getName() 获取该方法的名称
getParameterType() 按照声明顺序以 Class 数组的形式返回该方法各个参数的类型
getRetumType() 以 Class 对象的形式获得该方法的返回值类型
getExceptionTypes() 以 Class 数组的形式获得该方法可能抛出的异常类型
invoke(Object obj,Object...args) 利用 args 参数执行指定对象 obj 中的该方法,返回值为 Object 类型
isVarArgs() 查看该方法是否允许带有可变数量的参数,如果允许返回 true,否 则返回 false
getModifiers() 获得可以解析出该方法所采用修饰符的整数

5.通过反射访问的方法的使用

和上面一样,通过下列任意一个方法访问成员变量时将返回 Field 类型的对象或数组。

方法名 说明
Fields() 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共成员变量
getField (String name) 返回一个 Field 对象,它反映此 Class 对象所表示的类的指定公共成员变量
getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有成员变量
getDeclaredField (String name) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定成员变量

Field类的常用方法:

方法名称 说明
getName() 获得该成员变量的名称
getType() 获取表示该成员变量的 Class 对象
get(Object obj) 获得指定对象 obj 中成员变量的值,返回值为 Object 类型
set(Object obj,Object value) 将指定对象 obj 中成员变量的值设置为 value
getlnt(0bject obj) 获得指定对象 obj 中成员类型为 int 的成员变量的值
setlnt(0bject obj,int i) 将指定对象 obj 中成员变量的值设置为 i
setFloat(Object obj,float f) 将指定对象 obj 中成员变量的值设置为 f
getBoolean(Object obj) 获得指定对象 obj 中成员类型为 boolean 的成员变量的值
setBoolean(Object obj,boolean b) 将指定对象 obj 中成员变量的值设置为 b
getFloat(Object obj) 获得指定对象 obj 中成员类型为 float 的成员变量的值
setAccessible(boolean flag) 此方法可以设置是否忽略权限直接访问 private 等私有权限的成员变量
getModifiers() 获得可以解析出该方法所采用修饰符的整数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 一、概述 1、Java反射机制(Java-Reflect): 在运行状态中,对于任意一个类,都能够知道这个类中的所...
    年少懵懂丶流年梦阅读 4,376评论 0 5
  • 一、概述 Java反射机制定义 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法...
    CoderZS阅读 1,630评论 0 26
  • 不论是 Java 开发 还是 Android 开发,反射、泛型、注解 都是架构设计中很重要的一个知识点。 为了更好...
    JamFF阅读 535评论 0 4
  • 问题: 在运行时,对一个JAVA类,能否知道属性和方法;能否调用它的任意方法? 答案是可以的,JAVA提供一种反射...
    糖宝_阅读 760评论 0 1
  • 这部家长里短,关于兄弟妹矛盾的电视剧,看得我怒火攻心。 其实我不想看的,但是鸡汤文空闲的时候就看一两集,然后刹车。...
    油腻老虎油阅读 193评论 2 3