|
|
@@ -0,0 +1,52 @@ |
|
|
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() |
|
|
.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(); |
|
|
} |
|
|
} |
|
|
} |