java反射库介绍_一个事半功倍的Java反射库

在Java和Android中,我们常常会使用反射来达到一些兼容的目的。Java原生提供的反射很是麻烦,使用起来很是不方便。比如我们想要调UserManager的静态方法get,使用原生的实现如下try {

final Method m = UserManager.class.getMethod("get", Context.class);

m.setAccessible(true);

m.invoke(null, this);

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

实现起来好不麻烦。这其中

需要确定方法名和参数来获取对应的Method对象

设置Method对象的assessible为true

调用invoke方法,并且传入对应的参数

捕获其中可能抛出来的一连串异常

那么反射能简单点么,当然,而且还会简单很多。

这就是本文想要介绍的,jOOR(Java Object Oriented Reflection),它是一个对java.lang.reflect包的简单封装,使得我们使用起来更加直接和方便。

使用jOOR,上面的代码可以缩短成一行。Reflect.on(UserManager.class).call("get", getApplicationContext());

依赖

jOOR没有依赖。

使用jOOR只需要将这两个文件(Reflect.java,ReflectException.java),加入工程即可。

API介绍

Reflect

Reflect.on 包裹一个类或者对象,表示在这个类或对象上进行反射,类的值可以使Class,也可以是完整的类名(包含包名信息)

Reflect.create 用来调用之前的类的构造方法,有两种重载,一种有参数,一种无参数

Reflect.call 方法调用,传入方法名和参数,如有返回值还需要调用get

Reflect.get 获取(field和method返回)值相关,会进行类型转换,常与call和field组合使用

Reflect.field 获取属性值相关,需要调用get获取该值

Reflect.set 设置属性相关。

ReflectException

引入ReflectException避免了我们去catch过多的异常,也减少了纵向代码量,使得代码简洁不少。ReflectException抛出,可能是发生了以下异常。

ClassNotFoundException

IllegalAccessException

IllegalArgumentException

InstantiationException

InvocationTargetException

NoSuchMethodException

NoSuchFieldException

SecurityException

除此之外,ReflectException属于unchecked 异常,语法上不需要显式进行捕获,但是也需要根据实际情况,斟酌是否进行显式捕获该异常。

使用示例

创建实例String string = Reflect.on(String.class).create("Hello World").get();

访问属性(public,protected,package,private均可)char pathSeparatorChar = Reflect.on(File.class).create("/sdcard/droidyue.com").field("pathSeparatorChar").get();

修改属性(final属性也可以修改)String setValue = Reflect.on(File.class).create("/sdcard/drodiyue.com").set("path", "fakepath").get("path");

调用方法(public,protected,package,private均可)ArrayList arrayList = new ArrayList();

arrayList.add("Hello");

arrayList.add("World");

int value = Reflect.on(arrayList).call("hugeCapacity", 12).get();

实现原理

Reflect实际是对原生java reflect进行封装,屏蔽了无关细节。

以fields方法为例,其内部实现可以看出是调用了java原生提供的反射相关的代码。public Map fields() {

Map result = new LinkedHashMap();

Class> type = type();

do {

for (Field field : type.getDeclaredFields()) {

if (!isClass ^ Modifier.isStatic(field.getModifiers())) {

String name = field.getName();

if (!result.containsKey(name))

result.put(name, field(name));

}

}

type = type.getSuperclass();

} while (type != null);

return result;

}

Java高架构师、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频免费获取架构群:854180697    加群链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值