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);