前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java--反射机制

Java--反射机制

作者头像
SuperHeroes
发布2018-05-22 16:21:49
4510
发布2018-05-22 16:21:49
举报
文章被收录于专栏:云霄雨霁

Java程序中许多对象在运行时都会出现两种类型:编译期类型和运行期类型。例如:

代码语言:javascript
复制
Person p = new Student();

p编译期是Person类型,运行期是Student类型。如果我们需要调用该对象的运行期类型的某些方法,有两种方式:

在编译时和运行时完全知道对象和类的真实信息,这种情况下可以使用instanceof或isInstance()来进行判断;

如果编译时完全无法预知该对象和类的信息,就必须使用反射。

获得Class对象

  • 使用Class类的forName()方法
  • 调用某个类的class属性
  • 调用某个对象的getClass()方法

从程序Class中获得信息

Class对象包含很多方法,通过这些方法可以完成以下功能(具体方法可以查阅API):

  • 获取Class对应类所包含的构造器
  • 获取Class对应类所包含的方法
  • 获取Class对应类所包含的成员变量
  • 获取Class对应类所包含的注解(Annotation)
  • 获取Class对应类所包含的内部类
  • 获取Class对应类所实现的接口
  • 获取Class对应类所继承的父类
  • 获取Class对象对应类的修饰符、所在包、类名等基本信息
  • 判断Class对象对应类是否为接口、枚举、注解类型等

使用反射生成并操纵对象

创建对象两种生成方式:

  • 通过Class对象的newInstance()方法来创建该对象的实例,这种方法要求目标对象有默认构造器;
  • 通过Class对象获取指定的Constructor(构造器)对象,再调用Constructor对象的newInstance()方法来创建目标对象。通过这种方式可以选择指定的构造器。

调用方法:

当获得某个类的Class对象后,就可以通过该Class对象的getMethods()方法或getMethod()方法来获取全部或指定的方法----这两个方法返回的是Method[]数组,或Method对象。

每个Method对象对应一个方法,获得Method对象后程序可以通过该Method对象来调用它对应的方法。在每个Method中包含一个以下方法:

Object invoke(Object obj, Object... args):该方法中第一个参数obj是执行该方法的主调,后面的args是执行该方法时要传入的实参。

当通过Method的invoke()方法来调用对应方法时,Java会要求程序必须有调用该方法的权限。如果确实要调用private方法,可以通过下面的方法取消Java语言的访问权限检查:

setAccessable(boolean flag):值为true,则指示该Method在使用时取消Java语言访问权限检查;

其实setAccessable()方法并不属于Method,而是属于他的父类AccessableObject,所以Method、Constructor、Field、都可以调用该方法。从而实现通过反射调用private方法、private构造器、private成员变量。

访问成员变量:

通过Class对象的getFields()或getFirld()可以获取该类所包括的全部成员变量或指定成员变量。这两个方法返回的是Field[]数组,或Field对象。

每个Field对象对应一个成员变量,获得Field对象后程序可以通过该Method对象来访问该成员变量。在每个Field中包含两个个以下方法:

  • getXxx(Object obj):获取Object对象的该成员变量的值;
  • setXxx(Object obj, Xxx val):将Object对象的该成员变量的值设置为val.

这里的Xxx对应8中基本数据类型,如果是对象引用,则省略set/get后面的Xxx.

操作数组

Array类可以表示所有的数组,Array配合反射机制可以动态地创建数组、操作数组元素等。

  • static Object newInstance(Class<?> componentType, int...length): 创建一个具有指定元素类型、指定维度的数组;
  • static xxx getXxx(Object array, int index): 返回array数组中第index个元素;
  • static xxx setXxx(Object array, int index, xxx val): 将array数组中第index个数组设置为val.
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 获得Class对象
  • 从程序Class中获得信息
  • 使用反射生成并操纵对象
  • 操作数组
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档