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简介相关推荐

  1. 双表查询java代码_什么是JDBC?Java数据库连接性简介

    JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集.JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批 ...

  2. java 设计模式_快速上手Java设计模式之简介

    阅读本文约需要5分钟 大家好,我是你们的导师,经常看我朋友圈的同学应该知道,我每天会在微信上给大家免费提供以下服务! 1.长期为你提供最优质的学习资源! 2.给你解决技术问题! 3.每天在朋友圈里分享 ...

  3. java.util.concurrent简介

    文章目录 主要的组件 Executor ExecutorService ScheduledExecutorService Future CountDownLatch CyclicBarrier Sem ...

  4. Java GC系列(1):Java垃圾回收简介

    转载自  Java GC系列(1):Java垃圾回收简介 这篇教程是系列第一部分.首先会解释基本的术语,比如JDK.JVM.JRE和HotSpotVM.接着会介绍JVM结构和Java 堆内存结构.理解 ...

  5. java 模块化osgi_OSGi简介–模块化Java

    java 模块化osgi OSGi联盟是这种搁浅的管理机构,它始于1999年.其最初目标是为网络设备创建开放搁浅. 基于此思想,此规范也针对Java引入. Eclipse在Java中是第一个. 他们于 ...

  6. 【Java程序设计】Java基础类库简介

    Java基础类库简介 文章目录 Java基础类库简介 一.Java基础类库介绍 二.语言包(java.lang) (1)数据类型包裹类 1.生成数据类型包裹类对象的方法 2.得到基本数据类型数据的方法 ...

  7. Java虚拟机JVM简介与理解(三)

    Java虚拟机JVM简介与理解(三) 问题背景 PC程序计数器 虚拟机栈 本地方法栈 堆 元空间 方法区 运行时常量池 直接内存 Lyric: 彻底把我囚禁在你的呼吸 问题背景 Java虚拟机JVM简 ...

  8. Java JSON格式简介说明

    转自: Java JSON格式简介说明 下文笔者讲述java中JSON格式的相关简介说明,如下所示: JSON简介说明 JSON(JavaScript Object Notation) 是一种轻量级的 ...

  9. java开发工具包 jdk_什么是JDK? Java开发工具包简介

    java开发工具包 jdk Java开发工具包(JDK)与JVM(Java虚拟机)和JRE(Java运行时环境)一起是Java编程中使用的三个核心技术软件包之一. 重要的是要区分这三种技术,并了解它们 ...

  10. Java开发环境简介及下载

    文章目录 一. Java开发工具:JDK(Java Development Kit) 二.IDE(集成开发环境):Eclipse或IDEA 三. 文本编辑器:Visual Studio Code(VS ...

最新文章

  1. 22. datenum Matlab中的日期型数据处理函数
  2. python流程控制-python简单流程控制
  3. php加密登录_PHP写一个简单的网页加密认证
  4. ACM主要赛考察内容
  5. 达拉斯大学计算机硕士专业排名,美国大学研究生专业排名:人机交互
  6. Java的Gradle依赖关系,使用编译还是实现?
  7. Centos7快速安装docker
  8. PyCharm + PySide2/PySide6 外部工具配置
  9. jQuery取值和赋值的基本方法
  10. 浪潮服务器NF5280m5 raid硬盘驱动 配置,raid和系统
  11. 第十二届蓝桥杯省赛一等奖国赛一等奖经验总结
  12. android开发 dts、各种接口porting
  13. Zookeeper C API 官方示例程序
  14. linux防火墙ssh日志,[Linux] ubuntu开启SSH服务及防火墙设置
  15. 【题解】网络流24题一句话题解集合
  16. Verdi 基础介绍
  17. ssms不显示服务器名称,SSMS Sql Server 身份验证(设置用户名和密码)方式登陆
  18. matlab 谐波注入,一种基于谐波注入的新能源汽车永磁同步电机噪声控制方法与流程...
  19. 排序-------简单选择实现(Java实现)
  20. 华章IT图书书讯(2012年第3期)

热门文章

  1. 5. 什么是命名空间
  2. IOI2019团体总分前十排名:美国队夺魁,中国队第三,亚洲占六席
  3. MVC案例——问题一:多个请求使用一个servlet
  4. C# 新特性 操作符单?与??和 ?. 的使用
  5. 小程序模板template
  6. Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程...
  7. php调用一个c语言写的接口问题
  8. 使用jQuery插件filtrify实现的超酷动态标签分类摩托车新款展示
  9. ibatis.net 学习笔记
  10. 你先说什么事,我再决定有没有空