-
-
Save wu-sheng/2739ae2bd86f18d540495f64921ee0dc to your computer and use it in GitHub Desktop.
An example agent that intercepts a method of the bootstrap class loader.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package net.bytebuddy; | |
import net.bytebuddy.agent.ByteBuddyAgent; | |
import net.bytebuddy.agent.builder.AgentBuilder; | |
import net.bytebuddy.description.type.TypeDescription; | |
import net.bytebuddy.dynamic.ClassFileLocator; | |
import net.bytebuddy.dynamic.DynamicType; | |
import net.bytebuddy.dynamic.loading.ClassInjector; | |
import net.bytebuddy.implementation.MethodDelegation; | |
import net.bytebuddy.implementation.bind.annotation.SuperCall; | |
import net.bytebuddy.matcher.ElementMatchers; | |
import java.io.File; | |
import java.lang.instrument.Instrumentation; | |
import java.net.HttpURLConnection; | |
import java.net.URL; | |
import java.nio.file.Files; | |
import java.util.Collections; | |
import java.util.concurrent.Callable; | |
public class BootstrapAgent { | |
public static void main(String[] args) throws Exception { | |
premain(null, ByteBuddyAgent.install()); | |
HttpURLConnection urlConnection = (HttpURLConnection) new URL("http://www.google.com").openConnection(); | |
System.out.println(urlConnection.getRequestMethod()); | |
} | |
public static void premain(String arg, Instrumentation inst) throws Exception { | |
File temp = Files.createTempDirectory("tmp").toFile(); | |
ClassInjector.UsingInstrumentation.of(temp, ClassInjector.UsingInstrumentation.Target.BOOTSTRAP, inst).inject(Collections.singletonMap( | |
new TypeDescription.ForLoadedType(MyInterceptor.class), | |
ClassFileLocator.ForClassLoader.read(MyInterceptor.class).resolve())); | |
new AgentBuilder.Default() | |
.ignore(ElementMatchers.nameStartsWith("net.bytebuddy.")) | |
.enableBootstrapInjection(temp, inst) | |
.type(ElementMatchers.nameEndsWith(".HttpURLConnection")) | |
.transform(new AgentBuilder.Transformer() { | |
@Override | |
public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader) { | |
return builder.method(ElementMatchers.named("getRequestMethod")).intercept(MethodDelegation.to(MyInterceptor.class)); | |
} | |
}).installOn(inst); | |
} | |
public static class MyInterceptor { | |
public static String intercept(@SuperCall Callable<String> zuper) throws Exception { | |
System.out.println("Intercepted!"); | |
return zuper.call(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment