当业务中被第三方库的一些方法限制时,我们可以通过修改第三方库的方法实现来满足我们的需求 本文使用了byte-buddy[1]参考资料
es用Query.Builder 构建条件的时候,查询字段太长了 被截断了 断点图如下
造成这种方法的原因 通过查阅源码发现他重写了toString方法,当构建的参数过长是就会截断
最后拼接…
所以造成了dsl截断 但是这个需求是必须要做的,我们可以修改这个maxToStringLength的返回值值来解决这个问题
上边只是一种场景,下边如何修改举例,就不使用公司项目是,我们从stream-query中选一个方法来修改
我们之间修改这个方法的内容,让他直接返回一个我们想要的值
<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>
查看代码测试
/**
* 主函数,用于演示使用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);
}