JOOR反射库
本文最后更新于:2023年9月13日 下午
JOOR 是什么?
JOOR 是 Java 的一个很好用的反射相关的库。源码地址: https://github.com/jOOQ/jOOR
一、引入依赖
JOOR有三种实现。如果 maven 作为构建工具:
对于 Java 6 或者更高版本,可以用
1 |
|
对于 Java 8 或者更高版本,可以用:
1 |
|
对于 Java 9 或者更高版本,可以用:
1 |
|
接口都是一样的用,主要是用新版本 Java 特性对代码进行了优化。
gradle 可以按照类似如下方式引入:
1 |
|
二、示例
首先import Reflect 类下的静态方法(也可以只import Reflect 类):
import static org.joor.Reflect.*;
编写一个 NameInterface 接口:
package demo01;
public interface NameInterface {
String getName();
}
再写个 Person 类,注意,未实现 NameInterface 接口:
package demo01;
@Data
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;
}
}
获取 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
References
JOOR反射库
https://baymax55.github.io/2023/09/13/java/JOOR反射库/