gpt4 book ai didi

java - 重新定义/ rebase native 方法

转载 作者:行者123 更新时间:2023-11-30 06:14:40 24 4
gpt4 key购买 nike

我正在尝试用 ByteBuddy 替换 Java 引导类方法 System.currentTimeMillis。然而花了一天多的时间我仍然没有得到预期的结果。以下是我的代码:-

bootstrap.jar 中的 inteceptor 类用于appendToBootstrapClassLoaderSearch:

public class SystemTimeInterceptor {

public static long currentTimeMillis() {
return 1L;
}

代理类:

    instrumention.appendToBootstrapClassLoaderSearch(new JarFile("path/to/bootstrap.jar"));
final ByteBuddy byteBuddy = new ByteBuddy().with(Implementation.Context.Disabled.Factory.INSTANCE);

new AgentBuilder.Default()
.enableNativeMethodPrefix("foo")
.with(byteBuddy)
.with(AgentBuilder.InitializationStrategy.NoOp.INSTANCE)
.with(AgentBuilder.RedefinitionStrategy.REDEFINITION)
.with(AgentBuilder.TypeStrategy.Default.REDEFINE)
.ignore(none())
.type(ElementMatchers.named("java.lang.System"))
.transform(new AgentBuilder.Transformer() {
@Override
public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader,
JavaModule module) {
return builder.method(ElementMatchers.named("currentTimeMillis")).intercept(
MethodDelegation.to(SystemTimeInterceptor.class));
}

}).installOn(inst);

在我通过指定 javaagent 参数开始测试 main 方法后,我仍然在输出中看到当前时间(以毫秒为单位)。通过上述方式,我尝试重新定义 System.setSecurityManager 并且它有效。我还尝试删除策略设置以使用默认值。但它不起作用。

最佳答案

在尝试了不同的组合之后,我现在终于可以使用了。其实上面的代码是正确的。我认为一开始不起作用的可能原因是我注释掉了部分设置。无论如何,最重要的设置是.ignore(none())。否则,引导类将默认被忽略。

关于java - 重新定义/ rebase native 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49487148/

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