前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >反射利器——jOOR

反射利器——jOOR

作者头像
用户1108631
发布2019-08-17 12:39:03
发布2019-08-17 12:39:03
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

反射提供了运行时修改对象的能力,但Java提供的Refelec包实在是太复杂了,首先得到Class、再根据Class去找到Field或Method,再进行调用,虽然流程很固定,但写起来确实很冗长。有没有一种简单的工具可以方便快捷的实现反射调用呢? 答案是jOOR。 jOOR是一个非常简单方便的操作Class结构的API,支持链式调用,非常直观好理解。类库也很简单,一共就4个类。

使用

一个简单的例子

代码语言:javascript
代码运行次数:0
复制
import static org.joor.Reflect.*;String world = on("java.lang.String")  // Like Class.forName()                .create("Hello World") // Call most specific matching constructor                .call("substring", 6)  // Call most specific matching substring() method                .call("toString")      // Call toString()                .get();                // Get the wrapped object, in this case a String

对于上面代码,有几点说明:

  • on()方法用于获取Class对象,可以传入String、Object、Class
  • create()方法等同于调用该Class对象的构造方法,即实例化一个对象,有有参和无参两种形式
  • call()方法等于调用某一方法,并将参数传入
  • get()用于获取最终的对象

改变字段

代码语言:javascript
代码运行次数:0
复制
char[] newValue=new char[]{'H','e','l','l','o'};        String changed=on("java.lang.String")                .create("Hello World")                .set("value",newValue)                .call("toString")                .get();        System.out.println(changed);

改变字段很简单,使用set()方法即可,传入新的值即可了。

接口抽象

jOOR使用动态代理是一件很方便的事情,比如说:

代码语言:javascript
代码运行次数:0
复制
public interface StringProxy {  String substring(int beginIndex);}String substring = on("java.lang.String")                    .create("Hello World")                    .as(StringProxy.class) // Create a proxy for the wrapped object                    .substring(6);         // Call a proxy method

as()方法将一个实例代理到某个接口,as()方法内部使用的就是动态代理的Proxy方案。

与Java原生的反射比较

以上面改变String字段的例子为例,如果使用原生方法,那么代码如下:

代码语言:javascript
代码运行次数:0
复制
try{            String src="Hello World";            char[] newValue=new char[]{'H','e','l','l','o'};            Class clazz=src.getClass();            Field value_field=clazz.getDeclaredField("value");            value_field.setAccessible(true);            value_field.set(src,newValue);            System.out.println(src);        }catch (Exception e){            e.printStackTrace();        }

对比可以看到,jOOR是十分简单流利的

运行时编译Java代码

举个例子:

代码语言:javascript
代码运行次数:0
复制
Supplier<String> supplier = Reflect.compile(    "com.example.HelloWorld",    "package com.example;\n" +    "class HelloWorld implements java.util.function.Supplier<String> {\n" +    "    public String get() {\n" +    "        return \"Hello World!\";\n" +    "    }\n" +    "}\n").create().get();// Prints "Hello World!"System.out.println(supplier.get());

总结

经过上面的介绍,是不是发现jOOR对于处理反射而言,确实很简单方便,赶紧用起来吧!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 每天学点Android知识 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用
    • 一个简单的例子
      • 改变字段
    • 接口抽象
    • 与Java原生的反射比较
    • 运行时编译Java代码
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档