Java JOOR 反射库


JOOR 是什么?

JOOR 是 Java 的一个很好用的反射相关的库。源码地址: https://github.com/jOOQ/jOOR

一、引入依赖

JOOR有三种实现。如果 maven 作为构建工具:

对于 Java 6 或者更高版本,可以用

<dependency>
  <groupId>org.jooq</groupId>
  <artifactId>joor-java-6</artifactId>
  <version>0.9.7</version>
</dependency>

对于 Java 8 或者更高版本,可以用:

<dependency>
  <groupId>org.jooq</groupId>
  <artifactId>joor-java-8</artifactId>
  <version>0.9.7</version>
</dependency>

对于 Java 9 或者更高版本,可以用:

<dependency>
  <groupId>org.jooq</groupId>
  <artifactId>joor</artifactId>
  <version>0.9.7</version>
</dependency>

接口都是一样的用,主要是用新版本 Java 特性对代码进行了优化。

gradle 可以按照类似如下方式引入:

compile group: 'org.jooq', name: 'joor-java-8', version: '0.9.7'

二、示例

首先import Reflect 类下的静态方法(也可以只import Reflect 类):

import static org.joor.Reflect.*;

编写一个 NameInterface 接口:

package demo01;

public interface NameInterface {
    String getName();
}

再写个 Person 类,注意,未实现 NameInterface 接口:

package demo01;

public class Person {

    public static String STATIC_VALUE = "Hello World";

    private String name;

    private int score;

    public Person() {
    }

    public Person(String name, int score) {
        this.name = name;
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    public int addScore(int addValue) {
        return score + addValue;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", score=" + score +
                '}';
    }
}

获取 static 变量

String value = on(Person.class).get("STATIC_VALUE");
System.out.println(value);

运行后输出:

Hello World

设置 static 变量值

on(Person.class).set("STATIC_VALUE", "你好");
String value = on(Person.class).get("STATIC_VALUE");
System.out.println(value);

运行后输出:

你好

用有参构造函数初始化一个对象

Person p = on(Person.class).create("xiaosi", 99).get();
System.out.println(p);

运行后输出:

Person{name='xiaosi', score=99}

用类的字符串名和它的有参构造函数初始化一个对象

Person p = on("demo01.Person").create("xiaosi", 99).get();
System.out.println(p);

运行后输出:

Person{name='xiaosi', score=99}

用无参构造函数初始化一个对象

Person p = on(Person.class).create().get();
on(p).set("name", "xiaosi");  // 直接给私有变量设值
on(p).call("setScore", 99);  // 通过set方法给私有变量设值
System.out.println(p);

运行后输出:

Person{name='xiaosi', score=99}

获取 name 字段的值

Person p = on(Person.class).create("xiaosi", 99).get();
// 方式1
String name = on(p).get("name");
System.out.println(name);
// 方式2
name = on(p).call("getName").get();
System.out.println(name);

运行后输出:

xiaosi
xiaosi

调用 addScore 方法,传入参数,获取返回值

Person p = new Person("xiaosi", 99);
int result = on(p).call("addScore", 1).get();
System.out.println(result);

运行后输出:

100

实现一个 NameInterface 代理对象包装 Person

Person p = new Person("xiaosi", 99);
NameInterface nameInterface = on(p).as(NameInterface.class);
System.out.println(nameInterface instanceof Person); // 返回 false
System.out.println(nameInterface instanceof NameInterface); // 返回 true
System.out.println(nameInterface.getName());

运行后输出:

false
true
xiaosi


(本文完)


Java 教程