当业务中被第三方库的一些方法限制时,我们可以通过修改第三方库的方法实现来满足我们的需求
本文使用了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
|
public static void main(String[] args) {
ByteBuddyAgent.install(); Class<?> originalClass = HighlightHelper.class;
new ByteBuddy() .redefine(originalClass) .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());
String result = HighlightHelper.highlight("some", List.of(), s -> s); System.out.println(result);
}
|
2.3、运行结果