继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java反射详细介绍

幕布斯6054654
关注TA
已关注
手记 1264
粉丝 219
获赞 1011

1.反射概述

1.1 反射概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意一个方法和属性;

这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。

而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象

1.2 获取class文件对象的三种方式

1.2.1 这三种方式为:

a:Object类的getClass()方法

b:静态属性class

c:Class类中静态方法forName()

1.2.2 第一种方法【Object类的getClass()方法】

1.在内存中新建一个Person的实例,对象p对这个内存地址进行引用

2.对象p调用getClass()返回对象p所对应的Class对

3.调用newInstance()方法让Class对象在内存中创建对应的实例,并且让p2引用实例的内存地址

webp

1.2.3 第二种方法【静态属性class】

1.获取指定类型的Class对象,这里是Person

2.调用newInstance()方法在让Class对象在内存中创建对应的实例,并且让p引用实例的内存地址

webp

1.2.4 第三种方法【Class类中静态方法forName()】

1.通过JVM查找并加载指定的类(上面的代码指定加载了com.fanshe包中的Person类)

2.调用newInstance()方法让加载完的类在内存中创建对应的实例,并把实例赋值给p

注意:如果找不到时,它会抛出 ClassNotFoundException 这个异常,这个很好理解,因为如果查找的类没有在 JVM 中加载的话,自然要告诉开发者。

webp

1.3 通过反射获取无参构造方法并使用

A:获取所有构造方法

public Constructor[] getConstructors()

public Constructor[] getDeclaredConstructors()

B:获取单个构造方法

public Constructor getConstructor(Class... parameterTypes)

public Constructor getDeclaredConstructor(Class... parameterTypes)

方法关键字

getDeclareMethods() 获取所有的方法

getReturnType() 获取方法的返回值类型

getParameterTypes() 获取方法的传入参数类型

getDeclareMethod("方法名,参数类型.class,....") 获得特定的方法

构造方法关键字

getDeclaredConstructors() 获取所有的构造方法

getDeclaredConstructors(参数类型.class,....) 获取特定的构造方法

成员变量

getDeclaredFields 获取所有成员变量

getDeclaredField(参数类型.class,....) 获取特定的成员变量

父类和父接口

getSuperclass() 获取某类的父类

getInterfaces() 获取某类实现的接口

1.4 反射的定义

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

1.5 反射的组成

由于反射最终也必须有类参与,因此反射的组成一般有下面几个方面组成:

1.java.lang.Class.java:类对象;

2.java.lang.reflect.Constructor.java:类的构造器对象;

3.java.lang.reflect.Method.java:类的方法对象;

4.java.lang.reflect.Field.java:类的属性对象;

反射中类的加载过程

根据虚拟机的工作原理,一般情况下,类需要经过:加载->验证->准备->解析->初始化->使用->卸载这个过程,如果需要反射的类没有在内存中,那么首先会经过加载这个过程,并在在内存中生成一个class对象,有了这个class对象的引用,就可以发挥开发者的想象力,做自己想做的事情了。

1.6 反射的作用有哪些

前面只是说了反射是一种具有与Java类进行动态交互能力的一种机制,在Java和Android开发中,一般情况下下面几种场景会用到反射机制.

需要访问隐藏属性或者调用方法改变程序原来的逻辑,这个在开发中很常见的,由于一些原因,系统并没有开放一些接口出来,这个时候利用反射是一个有效的解决方法

自定义注解,注解就是在运行时利用反射机制来获取的。

在开发中动态加载类,比如在Android中的动态加载解决65k问题等等,模块化和插件化都离不开反射,离开了反射寸步难行。

2.反射的相关使用

2.1.4 通过反射获取成员变量[包含私有]并使用

webp

2.1.5 通过反射获取无参无返回值成员方法[包含私有]并使用

webp

2.1.6 通过反射获取带参无返回值成员方法并使用

webp



作者:阿里云云栖社区
链接:https://www.jianshu.com/p/36b9b47fcb65


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP