首页 > 编程语言 >一个事半功倍的Java反射库

一个事半功倍的Java反射库

时间:2022-11-10 21:04:46浏览次数:66  
标签:反射 jOOR Java get Reflect field 事半功倍 type class


在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());

依赖

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<String, Reflect> fields() {
Map<String, Reflect> result = new LinkedHashMap<String, Reflect>();
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;
}

库地址

以上就是这些,希望jOOR可以对大家的开发日常有所帮助。

标签:反射,jOOR,Java,get,Reflect,field,事半功倍,type,class
From: https://blog.51cto.com/u_3987305/5842089

相关文章

  • java——循环控制语句——for——while——do……while——整理01
                                                        ......
  • Day07.2:Java流程控制详解
    Java流程控制用户交互Scanner我们可以通过Scanner类来获取用户的输入,电脑通过我们的输入,执行输入语,实现程序的输入输出基本语法Scannername=newScanner(System.in)......
  • JavaWeb-05-Maven
    5.Maven为什么要学习这个技术?在javaweb开发中,需要使用大量的jar包,需要我们手动去导入;如何能够让一个东西自动帮我导入和配置这个jar包。因此,Maven诞生。5.1Maven架......
  • Day07.1:JavaDoc生成API文档
    JavaDocJavaDoc命令是用来生成自身API文档的API在线文档打开类名所在文件位置打开命令行3.输入命令行并运行4.在类名文件处生成了很多html文件,找到index.htm......
  • JavaWeb-02-web服务器
    2.web服务器2.1技术讲解ASP:微软:国内最早流行的就是ASP;在html中嵌入了VB的脚本ASP+COM;在ASP开发中,基本一个页面都有几千行的业务代码,页面及其混乱维护成本高C#I......
  • JavaWeb-04-Http
    4.http4.1http是什么超文本传输协议(HyperTextTransferProtocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以......
  • [JavaScript]格式化时间
    转载自网络 constformatDate=(time,fmt)=>{vardate=newDate(time);varformat=fmt||'YY-MM-DDhh:mm:ss'varyear=date.getFullYear(......
  • 【博学谷学习记录】超强总结,用心分享|Java基础分享-GC垃圾回收
    目录1.什么是GC2.GC主要针对区域3.Java如何判断对象是否存活4.GC垃圾回收机制4.1标记-清除法4.2标记-整理法4.3复制算法4.4分代收集算法5.内存分配策略及垃圾回收......
  • java使用redis存储时出现乱码问题
    今天用springboot做项目的时候,使用到了redis来做缓存。然后在存入redis的时候遇到了乱码的问题,这个问题是出现在序列化上,但是这个问题很好解决,晚上的方法也很多。因为......
  • Java 比较字符串之间大小
    LZ-Says:心态调整好~啥事儿都得开开心心的~前言公司让实现一个自动清除1小时内数据,SQL不熟悉,无奈之下,只能本地DB存储当前时间+小时去和当前时间进行比对。折腾好半天,突然想到......