How byte buddy advises classes modified by final. For example lava.lang.ProcessBuilder?

50 Views Asked by At

When I used byte buddy,I want to java.lang.ProcessBuilder operation on advice, but I found that java.lang.ProcessBuilder could not succeed. I checked the information and said that byte buddy cannot provide advice to class modified with final. is this real? Is there a way to fix it?

Below is my code

            AgentBuilder agentBuilder = new AgentBuilder.Default()
                    .disableClassFormatChanges()
                    .with(RETRANSFORMATION)
                    .ignore(none())
                    .ignore(
                            nameStartsWith("net.bytebuddy.")
                                    .or(nameStartsWith("jdk.internal.reflect."))
                                    .or(nameStartsWith("java.lang.invoke."))
                                    .or(nameStartsWith("com.sun.proxy."))
                                    .or(nameStartsWith("com.bc.horizon.fuzzing.agent"))
                                    .or(nameStartsWith("org.slf4j."))
                                    .or(nameStartsWith("io.grpc.netty."))
                                    .or(nameContains("javassist"))
                                    .or(nameContains("org.jacoco"))
                                    .or(nameContains(".asm."))
                                    .or(nameContains(".reflectasm."))
                    )
                    .disableClassFormatChanges()
                    .with(RETRANSFORMATION)
                    .with(new AgentListener())
                    .with(AgentBuilder.InitializationStrategy.NoOp.INSTANCE)
                    .with(AgentBuilder.TypeStrategy.Default.REDEFINE)
                    .with(AgentBuilder.TypeStrategy.Default.REBASE);

           AgentBuilder.Transformer transformer = (builder, typeDescription, classLoader, module) -> {
                        builder = builder.visit(Advice.to(monitorPlugin.adviceClass()).on(interceptPoint.buildMethodsMatcher()));
                        return builder;
                    };
                    agentBuilder = agentBuilder.type(interceptPoint.buildTypesMatcher()).transform(transformer);

I am very distressed now, please tell me what can I do? Thanks

I also tried specifying java.lang.ProcessBUilder directly, but still failed.

System.out.println("Java Agent !");
    AgentBuilder agentBuilder = new AgentBuilder.Default()
            .disableClassFormatChanges()
            .with(RETRANSFORMATION)
            .ignore(none())
            .ignore(
                    nameStartsWith("net.bytebuddy.")
                            .or(nameStartsWith("jdk.internal.reflect."))
                            .or(nameStartsWith("java.lang.invoke."))
                            .or(nameStartsWith("com.sun.proxy."))
                            .or(nameStartsWith("org.slf4j."))
                            .or(nameStartsWith("io.grpc.netty."))
                            .or(nameContains("javassist"))
                            .or(nameContains("org.jacoco"))
                            .or(nameContains(".asm."))
                            .or(nameContains(".reflectasm.")))
            .disableClassFormatChanges()
            .with(RETRANSFORMATION)
            .with(AgentBuilder.InitializationStrategy.NoOp.INSTANCE)
            .with(AgentBuilder.TypeStrategy.Default.REDEFINE)
            .with(AgentBuilder.TypeStrategy.Default.REBASE);
    agentBuilder.type(ElementMatchers.nameStartsWith("java.lang.ProcessBuilder"))
            .transform((builder, typeDescription, classLoader, module) ->
                    builder.method(ElementMatchers.isConstructor()).intercept(MethodDelegation.to(MyInterceptor.class)));
    agentBuilder.installOn(inst);
0

There are 0 best solutions below