joor,一个基于fluent API设计的反射API

来源:互联网 发布:网络机顶盒哪个最好 编辑:程序博客网 时间:2024/06/07 09:40

       你也许用过大名鼎鼎的JOOQ,该项目git主页上也有个joor仓库,里面设计了一种非常方便的java反射API。

地址:https://github.com/jOOQ/jOOR   


      看一些例子:

/** * @see https://github.com/jOOQ/jOOR */@Testpublic void test_simple_example() {Reflect reflectForString = Reflect.on(String.class).create("Hello doctor who");String world = reflectForString.call("substring", 6).call("toString").get();assertThat(world, equalTo("doctor who"));}

是不是比java反射api方便多了,其api设计也比较好用,源文件仅一个java文件。


joor也给出了一个访问java.lang.reflect.Proxy API的方法:

例如:

@Testpublic void test_proxy_abstraction() {String substring = Reflect.on(String.class).create("doctor").as(StringProxy.class).substring(1);assertThat(substring, equalTo("octor"));}interface StringProxy {String substring(int beginIndex);}

      不过,这种动态代理只是Create a proxy for the wrapped object allowing to typesafely invoke methods on it using a custom interface

      那么AOP切面如何实现呢。

     我改动以下这个方法:

@SuppressWarnings("unchecked")public <P, T> P as(Class<P> proxyType, Consumer<T> before, Consumer<T> after, T t) {final boolean isMap = (object instanceof Map);final InvocationHandler handler = new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {String name = method.getName();// Actual method name matches always come firsttry {before.accept(t);Object result = on(object).call(name, args).get();after.accept(t);return result;}// [#14] Simulate POJO behaviour on wrapped map objectscatch (ReflectException e) {if (isMap) {Map<String, Object> map = (Map<String, Object>) object;int length = (args == null ? 0 : args.length);if (length == 0 && name.startsWith("get")) {return map.get(property(name.substring(3)));}else if (length == 0 && name.startsWith("is")) {return map.get(property(name.substring(2)));}else if (length == 1 && name.startsWith("set")) {map.put(property(name.substring(3)), args[0]);return null;}}throw e;}}};return (P) Proxy.newProxyInstance(proxyType.getClassLoader(), new Class[] { proxyType }, handler);}


利用java8的函数式,实现aop。

例子:

@Testpublic void test_aop() {com.doctor.org.joor.Reflect.on(Person.class).create().as(Pepole.class, t -> {System.out.println("before....");}, t -> {System.out.println("after....");}, null).doWalk();}

interface Pepole {void doWalk();void doEate();}static class Person implements Pepole {private String name = "doctor who";private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic void doWalk() {System.out.println(name + " do walk");}@Overridepublic void doEate() {System.out.println(name + " do eate");}}


输出:

before....doctor who do walkafter....


0 0
原创粉丝点击