gpt4 book ai didi

java - ByteBuddy 没有重新定义静态方法

转载 作者:行者123 更新时间:2023-11-30 03:20:34 28 4
gpt4 key购买 nike

我正在尝试使用 ByteBuddy 重新定义 2 个方法,如下所示:

ClassLoader classLoader = ClassLoader.getSystemClassLoader();
ClassLoadingStrategy.Default classLoadingStrategy = ClassLoadingStrategy.Default.INJECTION;
new ByteBuddy().redefine(CommandBase.class).method(returns(Item.class)).intercept(MethodDelegation.to(CppItemInterceptor.class)).make().load(classLoader, classLoadingStrategy);
new ByteBuddy().redefine(CommandBase.class).method(returns(Block.class)).intercept(MethodDelegation.to(CppBlockInterceptor.class)).make().load(classLoader, classLoadingStrategy);
try {
System.out.println(CppBlockInterceptor.getBlockByText(null, "1").getLocalizedName());
System.out.println(CommandBase.getBlockByText(null, "1").getLocalizedName());
} catch (Exception e) {
e.printStackTrace();
}

直接调用 CppBlockInterceptor 会产生预期的输出,但对应该被替换的方法的调用仍然使用旧的行为。这有什么原因吗?

最佳答案

在您有机会重新定义它之前,您的 CommandBase 类已经加载。如果不使用 Java 代理,Byte Buddy 无法替换已加载的类。尝试运行这个:

TypeDescription commandBase = new TypePool.Default.ofClassPath()
.locate("my.package.CommandBase");
new ByteBuddy()
.redefine(commandBase, ClassFileLocator.ForClassLoader.ofClassPath())
.method(returns(Block.class)).intercept(MethodDelegation.to(CppBlockInterceptor.class))
.make()
.load(ClassLoader.getSystemClassLoader(), ClassLoadingStrategy.Default.INJECTOR);

CppBlockInterceptor.getBlockByText(null, "1").getLocalizedName()

在调用之前无需显式引用CommandBase,它将起作用。不过,更好的方法是使用 AgentBuilder 和 Java 代理。 documentation of Byte Buddy explains why .

关于java - ByteBuddy 没有重新定义静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31437321/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com