Skip to content

Instantly share code, notes, and snippets.

@wu-sheng
Forked from raphw/BootstrapAgent.java
Created January 17, 2018 03:09

Revisions

  1. @raphw raphw revised this gist Dec 23, 2016. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions BootstrapAgent.java
    Original file line number Diff line number Diff line change
    @@ -32,6 +32,7 @@ public static void premain(String arg, Instrumentation inst) throws Exception {
    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() {
  2. @raphw raphw created this gist Feb 29, 2016.
    52 changes: 52 additions & 0 deletions BootstrapAgent.java
    Original file line number Diff line number Diff line change
    @@ -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();
    }
    }
    }