博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java反射的封装
阅读量:6266 次
发布时间:2019-06-22

本文共 1107 字,大约阅读时间需要 3 分钟。

Java这种以啰嗦著称的编程语言,反射代码也很啰嗦。每次看到很多人使用原生的反射接口,我心里都在想,愚蠢的人类啊,为什么不封装一下再用。

能用到反射的场景

  • 不能静态决定,比如根据URL参数的字符串调用相应方法的时候。

  • 避免样板代码的时候,例如可以用反射代替,繁琐的JSON对象解析代码。

  • 避免显式依赖的时候,有时候能用来打破项目之间的循环依赖关系。但要慎用,如果之间接口比较复杂,还是建议单独使用协议接口的方法。

  • 访问私有成员,做一些黑科技的事情的时候。

方法调用封装

封装前的反射调用方法:

try {  Class
class = obj.getClass(); Method method = class.getDeclaredMethod("foo", new Class[] { String.class }); method.invoke(obj, new Object[] {"hi"});} catch (Exceptione ex) {}

非反射直接调用:

obj.foo("hi");

封装后的反射调用:

Reflection.callMethod(obj, "foo", "hi");

字段赋值封装

封装前的反射调用方法:

try {  Class
class = obj.getClass(); Field field = class.getDeclaredField("bar"); field.setAccessible(true); Object old = field.get(obj); field.set(obj, "hi"); return old;} catch (Exceptione ex) {}

非反射直接字段赋值:

obj.bar = "hi";

封装后字段赋值:

Reflection.setField(obj, "bar", "hi");

源码

Talk is cheap, show me the code.

这里是我简单的,不是很完整,只是解决了目前自己的需求。源码也就100行,自己看吧。

有Declared和无Declared的区别

在Class类接口中,getDeclaredMethod getDeclaredField和getMethod getField的区别。

带Declared的包含本类的私有和公开成员,不包含继承的成员。不带Declare不含继承的和自身的公开成员,不包含私有成员。
如果要访问全体的成员,包括所有继承的和私有的,那么代码只会更加复杂。幸运的是Reflection类的封装已经帮你实现了。

转载地址:http://pbcpa.baihongyu.com/

你可能感兴趣的文章
A股实时股票行情,指数行情web API 使用方法
查看>>
大整数算法[04] 位操作
查看>>
C# Parsing 类实现的 PDF 文件分析器
查看>>
汇编学习(1)
查看>>
Google招聘 Lead Software Engineer
查看>>
Bzoj1026 windy数
查看>>
Java07
查看>>
mongodb基础知识_4
查看>>
ROP
查看>>
Windows常用网络命令技巧汇总 [转]
查看>>
【noi 2.6_8787】数的划分(DP){附【转】整数划分的解题方法}
查看>>
Win8 app判断网络连接状态
查看>>
CentOS 6.7下nginx SSL证书部署的方法分享
查看>>
菜鸟学SQLServer--数据文件和日志文件
查看>>
分享我积攒的测试相关的资料收集awesome-test
查看>>
1.2、solidworks入门1(零件建模、装配设计、工程图设计)
查看>>
SpringBoot Docker Mysql安装,Docker安装Mysql
查看>>
td中使用overflow:hidden; 无效解决方案
查看>>
Apache Flume 1.7.0 自定义输入输出
查看>>
第十周作业
查看>>