Java反射库jOOR简介
jOOR简介
jOOR是基于java反射api的一个简单包装类,简单却十分实用。
jOOR这个名字是从jOOQ中得到的灵感,jOOQ是一个很棒的SQL的API。
一个简单的示例
// All examples assume the following static import:
import static org.joor.Reflect.*;String world = on("java.lang.String") // on后面放入类的全名,这里是String类.create("Hello World") // 将字符串“Hello World”,传入构造方法中.call("substring", 6) // 执行subString这个方法,并且传入6作为参数.call("toString") // 执行toString方法.get(); // 得到包装好的类,这里是一个String对象
抽象代理
jOOR也可以方便的使用java.lang.reflect.Proxy的API
public interface StringProxy {String substring(int beginIndex);
}String substring = on("java.lang.String").create("Hello World").as(StringProxy.class) // 为包装类建立一个代理.substring(6); // 访问代理方法
和java.lang.reflect的对比
使用jOOR的代码:
Employee[] employees = on(department).call("getEmployees").get();for (Employee employee : employees) {Street street = on(employee).call("getAddress").call("getStreet").get();System.out.println(street);
}
用传统的反射方式写的代码:
try {Method m1 = department.getClass().getMethod("getEmployees");Employee employees = (Employee[]) m1.invoke(department);for (Employee employee : employees) {Method m2 = employee.getClass().getMethod("getAddress");Address address = (Address) m2.invoke(employee);Method m3 = address.getClass().getMethod("getStreet");Street street = (Street) m3.invoke(address);System.out.println(street);}
}// There are many checked exceptions that you are likely to ignore anyway
catch (Exception ignore) {// ... or maybe just wrap in your preferred runtime exception:throw new RuntimeException(e);
}
更多示例
建立一个测试类:
package kale.androidframework;public class Kale {private String name;private String className;Kale() {}Kale(String clsName) {this.className = clsName;}public void setName(String name) {this.name = name;}private String getName() {return name;}public String getClassName() {return className;}public static void method() {}
}
这个类中有有参构造方法和无参构造方法,还有get和set方法。这里的类变量都是private的,有一个get方法也是private的。我们现在要尝试利用jOOR来访问变量和方法:
String name = null;Kale kale;// 【创建类】kale = Reflect.on(Kale.class).create().get(); // 无参数 kale = Reflect.on(Kale.class).create("kale class name").get();// 有参数System.err.println("------------------> class name = " + kale.getClassName());// 【调用方法】Reflect.on(kale).call("setName","调用setName");// 多参数System.err.println("调用方法:name = " + Reflect.on(kale).call("getName"));// 无参数// 【得到变量】name = Reflect.on(kale).field("name").get();// 复杂name = Reflect.on(kale).get("name");// 简单System.err.println("得到变量值: name = " + name);// 【设置变量的值】Reflect.on(kale).set("className", "hello");System.err.println("设置变量的值: name = " + kale.getClassName());System.err.println("设置变量的值: name = " + Reflect.on(kale).set("className", "hello2").get("className"));
相似的工程
Everyday Java reflection with a fluent interface:
- http://docs.codehaus.org/display/FEST/Reflection+Module
- http://projetos.vidageek.net/mirror/mirror/
Reflection modelled as XPath (quite interesting!)
- http://commons.apache.org/jxpath/users-guide.html
Java反射库jOOR简介相关推荐
- 双表查询java代码_什么是JDBC?Java数据库连接性简介
JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集.JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批 ...
- java 设计模式_快速上手Java设计模式之简介
阅读本文约需要5分钟 大家好,我是你们的导师,经常看我朋友圈的同学应该知道,我每天会在微信上给大家免费提供以下服务! 1.长期为你提供最优质的学习资源! 2.给你解决技术问题! 3.每天在朋友圈里分享 ...
- java.util.concurrent简介
文章目录 主要的组件 Executor ExecutorService ScheduledExecutorService Future CountDownLatch CyclicBarrier Sem ...
- Java GC系列(1):Java垃圾回收简介
转载自 Java GC系列(1):Java垃圾回收简介 这篇教程是系列第一部分.首先会解释基本的术语,比如JDK.JVM.JRE和HotSpotVM.接着会介绍JVM结构和Java 堆内存结构.理解 ...
- java 模块化osgi_OSGi简介–模块化Java
java 模块化osgi OSGi联盟是这种搁浅的管理机构,它始于1999年.其最初目标是为网络设备创建开放搁浅. 基于此思想,此规范也针对Java引入. Eclipse在Java中是第一个. 他们于 ...
- 【Java程序设计】Java基础类库简介
Java基础类库简介 文章目录 Java基础类库简介 一.Java基础类库介绍 二.语言包(java.lang) (1)数据类型包裹类 1.生成数据类型包裹类对象的方法 2.得到基本数据类型数据的方法 ...
- Java虚拟机JVM简介与理解(三)
Java虚拟机JVM简介与理解(三) 问题背景 PC程序计数器 虚拟机栈 本地方法栈 堆 元空间 方法区 运行时常量池 直接内存 Lyric: 彻底把我囚禁在你的呼吸 问题背景 Java虚拟机JVM简 ...
- Java JSON格式简介说明
转自: Java JSON格式简介说明 下文笔者讲述java中JSON格式的相关简介说明,如下所示: JSON简介说明 JSON(JavaScript Object Notation) 是一种轻量级的 ...
- java开发工具包 jdk_什么是JDK? Java开发工具包简介
java开发工具包 jdk Java开发工具包(JDK)与JVM(Java虚拟机)和JRE(Java运行时环境)一起是Java编程中使用的三个核心技术软件包之一. 重要的是要区分这三种技术,并了解它们 ...
- Java开发环境简介及下载
文章目录 一. Java开发工具:JDK(Java Development Kit) 二.IDE(集成开发环境):Eclipse或IDEA 三. 文本编辑器:Visual Studio Code(VS ...
最新文章
- 22. datenum Matlab中的日期型数据处理函数
- python流程控制-python简单流程控制
- php加密登录_PHP写一个简单的网页加密认证
- ACM主要赛考察内容
- 达拉斯大学计算机硕士专业排名,美国大学研究生专业排名:人机交互
- Java的Gradle依赖关系,使用编译还是实现?
- Centos7快速安装docker
- PyCharm + PySide2/PySide6 外部工具配置
- jQuery取值和赋值的基本方法
- 浪潮服务器NF5280m5 raid硬盘驱动 配置,raid和系统
- 第十二届蓝桥杯省赛一等奖国赛一等奖经验总结
- android开发 dts、各种接口porting
- Zookeeper C API 官方示例程序
- linux防火墙ssh日志,[Linux] ubuntu开启SSH服务及防火墙设置
- 【题解】网络流24题一句话题解集合
- Verdi 基础介绍
- ssms不显示服务器名称,SSMS Sql Server 身份验证(设置用户名和密码)方式登陆
- matlab 谐波注入,一种基于谐波注入的新能源汽车永磁同步电机噪声控制方法与流程...
- 排序-------简单选择实现(Java实现)
- 华章IT图书书讯(2012年第3期)
热门文章
- 5. 什么是命名空间
- IOI2019团体总分前十排名:美国队夺魁,中国队第三,亚洲占六席
- MVC案例——问题一:多个请求使用一个servlet
- C# 新特性 操作符单?与??和 ?. 的使用
- 小程序模板template
- Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程...
- php调用一个c语言写的接口问题
- 使用jQuery插件filtrify实现的超酷动态标签分类摩托车新款展示
- ibatis.net 学习笔记
- 你先说什么事,我再决定有没有空