JAVA反射调用总结

一.概述

这几天一直在忙于一个框架的开发,我们的初衷是基于配置产出业务数据,不要让开发工程师去编写JAVA代码来产出账单,一开始觉得这件事情很难,很难做到不开发JAVA代码,事实确实如此,不过数据如果规整的话,基于配置完全可以,一行java代码都不用写。当然这个框架目前还在测试中,核心功能已经开发结束了,开发一个框架和开发一个业务功能要考虑的事情完全不一样,在开发框架之前,需要把所有可能出现的需求都要考虑一下,其实框架就是高度的抽象,我们把平时所做的一些功能逻辑梳理清楚,再上一个高度就能梳理出一个框架。在开发这个框架的过程中用到了反射,感觉JDK的反射写起来代码有点多,于是考虑用Spring框架提供反射工具类,还有木有其他处理反射调用框架或者工具呢?

二.概述

1.利用JDK本身的API来实现反射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Object oo = new InnerObject();
Method[] methods = oo.getClass().getDeclaredMethods();
for (Method method : methods) {
    if (method.getName().equals("test")) {
        try {
            Object retValue = method.invoke(oo, null);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

一个反射调用要写这么多代码,我也是醉了。。。。

2.利用Spring的工具类来实现反射
1
2
3
4
5
6
7
8
9
10
Method method = ReflectionUtils.findMethod(oo.getClass(), "test", null);
try {
    Object retValue = method.invoke(oo, null);
} catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}

虽然木有了for循环,但是代码还是有些多,不够精简。

3.利用Mirror来做反射
1
2
3
4
5
<dependency>
 	<groupId>net.vidageek</groupId>
 	<artifactId>mirror</artifactId>
 	<version>1.6.1</version>
</dependency>
1
2
Object oo = new InnerObject();
Object retValue = new Mirror().on(oo).invoke().method("test1").withoutArgs();

看看mirror是不是精简了很多呢?还是函数编程思想,这种写法在JDK8中会非常普遍。这里只是举例说明了一下方法调用,其他更多反射调用参考 mirror

三.总结

对于一个点,多思考,寻求最简单的写法,你会有更多的收获。