资讯专栏INFORMATION COLUMN

Java反射的封装

raledong / 3087人阅读

摘要:每次看到很多人使用原生的反射接口,我心里都在想,愚蠢的人类啊,为什么不封装一下再用。幸运的是类的封装已经帮你实现了。

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类的封装已经帮你实现了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65964.html

相关文章

  • 封装BeanMap以及java反射和内省

    摘要:所以,我实现了一个称为的类来应用反射。现在流行的语言大都支持反射。这组内省主要是针对类进行操作的,能够获取类的属性信息。可以看到,通过的内省机制,解决了的最关键的问题。在封装反射的时候,会充分考虑到各种情况。 BeanMap 学习具体的技术工具的好办法就是些Demo、造轮子。所以,我实现了一个称为BeanMap的类来应用java反射API。 这个BeanMap的功能是将一个Bean包装...

    张巨伟 评论0 收藏0
  • Java反射Java 泛型基础

    摘要:笔记来源反射综述类的使用方法的反射成员变量的反射构造函数的反射类加载机制类的使用在面向对象的世界里,万事万物皆对象。 笔记来源:IMOOC 反射 Java Reflect 综述 Class类的使用 方法的反射 成员变量的反射 构造函数的反射 类加载机制 Class 类的使用 在面向对象的世界里,万事万物皆对象。 但在Java里面有两样东西不是对象:静态的成员、普通数据类型类...

    seanHai 评论0 收藏0
  • Java9模块化学习笔记二之模块设计模式

    摘要:但是模块化当中,无法扫描只有模块中可以使用有两种解决方案定义一个专门的资源模块,并使用提供的接口,实现它,并将这个实现注册为服务。有两种方式使用或包名,包名模块名使用运行时动态。 模块设计的原则: 1、防止出现编译时循环依赖(主要是编译器不支持),但运行时是允许循环依赖的,比如GUI应用2、明确模块的边界 几种模块设计: API模块,聚合模块(比如java.base) 可选依赖 两种方...

    李文鹏 评论0 收藏0
  • 在运行期通过反射了解JVM内部机制

    摘要:我们找到了许多有趣的工具和组件用来检测状态的各个方面,其中一个就是在运行期通过反射了解内部机制。由于包含多种的实现,就是供具体实现比如必须继承的抽象类。调试器框架是可扩展的,这意味着可以通过继承这个抽象类来使用另一个调试器。 在日常工作中,我们都习惯直接使用或者通过框架使用反射。在没有反射相关硬编码知识的情况下,这是Java和Scala编程中使用的类库与我们的代码之间进行交互的一种主要...

    crossea 评论0 收藏0

发表评论

0条评论

raledong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<