实战中反射的应用
Posted wx61721d9ccd9c5
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实战中反射的应用相关的知识,希望对你有一定的参考价值。
1.概念
反射 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Serializable),也包括fields和methods的所有信息,并可于运行时改变fields内容或调用methods。
一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。
尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。
用白话讲 反射 能够获取java类在运行过程中(class文件)的对象,方法,成员变量。
ps:反射能获取private方法,楼主面试常问。
2.名词解析
- Class类:代表一个类
- Field类:代表类的成员变量
- Method类:代表类的方法
- Constructor类:代表类的构造方法
- Array类:提供了动态创建数组,以及访问数组的元素的静态方法
3.常用操作
1.获取类的变量
public Object getProperty(Object object, String fieldName) throws Exception {
Class class = object.getClass(); //得到该类的Class。
Field field = class .getField(fieldName); //获取声明属性
Object property = field.get(object); //获取类属性
return property;
}
2.获取类的静态变量
public Object getStaticProperty(String className, String fieldName)
throws Exception {
Class class = Class.forName(className); //获取类的Class
Field field = class.getField(fieldName); //获取声明的属性
Object property = field.get(Class); 获取静态属性
return property;
}
3.执行类的方法
public Object invokeMethod(Object object, String methodName, Object[] args) throws Exception {
Class Class = object.getClass(); //获取class对象
Class[] argsClass = new Class[args.length]; //获取参数
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = class.getMethod(methodName,argsClass); //获取方法
return method.invoke(object, args); //通过发射调用方法
}
4.执行类的静态方法
public Object invokeStaticMethod(String className, String methodName,
Object[] args) throws Exception {
Class Class = Class.forName(className); //获取class
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
} //获取参数
Method method = class.getMethod(methodName,argsClass); //获取方法
return method.invoke(null, args); //通过反射执行
}
5.新建实例
public Object newInstance(String className, Object[] args) throws Exception {
Class class = Class.forName(className); //获取class
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
} //获取参数
Constructor cons = class.getConstructor(argsClass); //获取构造方法
return cons.newInstance(args); //新建实例
}
6.判断是否是指定类
public boolean isInstance(Object obj, Class cls) {
return cls.isInstance(obj);
}
7.获取数组属性
public Object getByArray(Object array, int index) {
return Array.get(array,index);
}
以上是关于实战中反射的应用的主要内容,如果未能解决你的问题,请参考以下文章
Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段