有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java重定义/重基本机方法

我试图取代Java引导类方法系统。currentTimeMillis和ByteBuddy在一起。然而,在花了一天多的时间后,我仍然没有得到预期的结果。以下是我的代码:-

bootstrap中的inteceptor类。用于appendToBootstrapClassLoaderSearch的jar:

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参数开始我的test main方法之后,我仍然可以在输出中看到以毫秒为单位的当前时间。 通过上述方法,我试图重新定义系统。设置SecurityManager,它就可以工作了。我还试图删除策略设置以使用默认设置。但它不起作用


共 (1) 个答案

  1. # 1 楼答案

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