反射提供了运行时修改对象的能力,但Java提供的Refelec包实在是太复杂了,首先得到Class、再根据Class去找到Field或Method,再进行调用,虽然流程很固定,但写起来确实很冗长。有没有一种简单的工具可以方便快捷的实现反射调用呢? 答案是jOOR。 jOOR是一个非常简单方便的操作Class结构的API,支持链式调用,非常直观好理解。类库也很简单,一共就4个类。
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
对于上面代码,有几点说明:
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使用动态代理是一件很方便的事情,比如说:
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方案。
以上面改变String字段的例子为例,如果使用原生方法,那么代码如下:
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是十分简单流利的
举个例子:
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对于处理反射而言,确实很简单方便,赶紧用起来吧!!!
本文分享自 每天学点Android知识 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!