当业务中被第三方库的一些方法限制时,我们可以通过修改第三方库的方法实现来满足我们的需求
本文使用了byte-buddy[1]参考资料

1、场景

es用Query.Builder 构建条件的时候,查询字段太长了 被截断了
断点图如下

造成这种方法的原因
通过查阅源码发现他重写了toString方法,当构建的参数过长是就会截断


最后拼接…

所以造成了dsl截断
但是这个需求是必须要做的,我们可以修改这个maxToStringLength的返回值值来解决这个问题

2、如何修改?

上边只是一种场景,下边如何修改举例,就不使用公司项目是,我们从stream-query中选一个方法来修改

我们之间修改这个方法的内容,让他直接返回一个我们想要的值

2.1、引入byte-buddy

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.14.12</version>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy-agent</artifactId>
<version>1.14.11</version>
</dependency>

2.2、代码实现

查看代码测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* 主函数,用于演示使用ByteBuddy动态修改类的行为。
* @param args 命令行参数,本例中未使用。
*/
public static void main(String[] args) {

// 安装ByteBuddyAgent,用于在运行时修改类。
ByteBuddyAgent.install();

// 定义原始类,本例中为HighlightHelper类。
Class<?> originalClass = HighlightHelper.class;

// 使用ByteBuddy重定义原始类。
new ByteBuddy()
.redefine(originalClass)
// 选择要修改的方法:名为highlight,接受String、List和UnaryOperator作为参数,返回String类型。
.method(ElementMatchers.named("highlight")
.and(ElementMatchers.takesArguments(String.class, List.class, UnaryOperator.class))
.and(ElementMatchers.returns(String.class)))
// 为选中的方法插入固定返回值"修改成功",即修改方法的行为。
.intercept(FixedValue.value("修改成功"))
// 生成并加载修改后的类定义,使用已安装的代理进行类加载。
.make()
.load(originalClass.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent());

// 调用修改后的HighlightHelper类的highlight方法,验证修改是否成功。
String result = HighlightHelper.highlight("some", List.of(), s -> s);
System.out.println(result);

}

2.3、运行结果