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
- joor,一个基于fluent API设计的反射API
- HttpClient Fluent API 的使用
- Zookeeper实例Curator API-使用Fluent风格的API接口来创建一个ZooKeeper客户端
- EF Code First 使用反射加载程序集中的Fluent API配置文件
- 基于ThinkPHP 的Api 设计
- apache fluent api
- Entity Framework Fluent API
- 利用JOOR简单编写java的反射
- 反射API的一个简单实例
- HttpClient4.2 Fluent API学习
- HttpClient4.2 Fluent API学习
- HttpClient4.2 Fluent API学习
- 一个基于Spring Boot的API、RESTful API项目
- 基于OPenStack平台的C++ API 设计
- 基于SpringMVC的RESTful API设计
- 基于SpringMVC的RESTful API设计
- 基于SpringMVC的RESTful API设计
- 基于HTTPS的REST API设计初探
- Python_Scrapy_6.错误与异常
- 黑马程序员<Java笔记<IO流>>
- Servlet--ServletConfig接口,GenericServlet类
- 二叉树 各种遍历算法
- OC坑集: ARC 下覆写 setter/getter
- joor,一个基于fluent API设计的反射API
- 《重构》第一章 笔记
- HDU 数塔 (dp)
- android studio上传代码到github
- 估算之痛
- 【机房收费系统】——存储过程的应用
- Linux内核中常见内存分配函数
- HDU Common Subsequence (dp)
- jiongjiong.com.cn域名600元被我竞拍到了,嘿嘿