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