我正在尝试用ByteBuddy替换Java引导类方法System.currentTimeMillis。然而,花了一天多的时间后,我仍然没有得到预期的结果。以下是我的代码: -
bootstrap.jar中用于appendToBootstrapClassLoaderSearch的inteceptor类:
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参数启动我的测试主方法后,我仍然看到输出中的当前时间(以毫秒为单位)。 通过上面的方式,我尝试重新定义System.setSecurityManager,它的工作原理。我还尝试删除策略设置以使用默认值。但它不起作用。
答案 0 :(得分:0)
尝试不同的组合后,我终于明白了。实际上上面的代码是正确的。我认为最初可能不起作用的可能原因是我注释掉了部分设置。无论如何,最重要的设置是.ignore(none())。如果没有它,默认情况下将忽略引导类。