From 852aec981d37dedd6930b901bbabce1c448b0a48 Mon Sep 17 00:00:00 2001 From: wusheng Date: Thu, 10 Mar 2016 16:39:14 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E6=9E=84=E9=80=A0=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E6=8B=A6=E6=88=AA=E7=9A=84=E6=B5=8B=E8=AF=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bytebuddy/ConstructorInterceptor.java | 16 +++++ ...nterceptor.java => MethodInterceptor.java} | 7 ++- .../test/ai/cloud/bytebuddy/SimulateMain.java | 62 ++++++++++--------- .../test/ai/cloud/bytebuddy/TestClass.java | 9 +++ 4 files changed, 62 insertions(+), 32 deletions(-) create mode 100644 skywalking-api/src/test/java/test/ai/cloud/bytebuddy/ConstructorInterceptor.java rename skywalking-api/src/test/java/test/ai/cloud/bytebuddy/{Interceptor.java => MethodInterceptor.java} (63%) diff --git a/skywalking-api/src/test/java/test/ai/cloud/bytebuddy/ConstructorInterceptor.java b/skywalking-api/src/test/java/test/ai/cloud/bytebuddy/ConstructorInterceptor.java new file mode 100644 index 0000000000..2fe37919e6 --- /dev/null +++ b/skywalking-api/src/test/java/test/ai/cloud/bytebuddy/ConstructorInterceptor.java @@ -0,0 +1,16 @@ +package test.ai.cloud.bytebuddy; + +import net.bytebuddy.implementation.bind.annotation.AllArguments; +import net.bytebuddy.implementation.bind.annotation.RuntimeType; +import net.bytebuddy.implementation.bind.annotation.This; + +public class ConstructorInterceptor { + @RuntimeType + public void intercept(@AllArguments Object[] allArguments) { + System.out + .println("ConstructorInterceptor size:" + allArguments.length); + if(allArguments.length > 0){ + System.out.println("ConstructorInterceptor param[0]=" + allArguments[0]); + } + } +} diff --git a/skywalking-api/src/test/java/test/ai/cloud/bytebuddy/Interceptor.java b/skywalking-api/src/test/java/test/ai/cloud/bytebuddy/MethodInterceptor.java similarity index 63% rename from skywalking-api/src/test/java/test/ai/cloud/bytebuddy/Interceptor.java rename to skywalking-api/src/test/java/test/ai/cloud/bytebuddy/MethodInterceptor.java index 7180f2b1ca..332971af80 100644 --- a/skywalking-api/src/test/java/test/ai/cloud/bytebuddy/Interceptor.java +++ b/skywalking-api/src/test/java/test/ai/cloud/bytebuddy/MethodInterceptor.java @@ -7,12 +7,13 @@ import net.bytebuddy.implementation.bind.annotation.AllArguments; import net.bytebuddy.implementation.bind.annotation.Origin; import net.bytebuddy.implementation.bind.annotation.RuntimeType; import net.bytebuddy.implementation.bind.annotation.SuperCall; +import net.bytebuddy.implementation.bind.annotation.This; -public class Interceptor{ +public class MethodInterceptor{ @RuntimeType - public Object intercept(@AllArguments Object[] allArguments, @Origin Method method, @SuperCall Callable zuper){ + public Object intercept(@This Object obj, @AllArguments Object[] allArguments, @Origin Method method, @SuperCall Callable zuper){ try { - return "intercept_" + zuper.call(); + return method.getName() + ":intercept_" + zuper.call(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); diff --git a/skywalking-api/src/test/java/test/ai/cloud/bytebuddy/SimulateMain.java b/skywalking-api/src/test/java/test/ai/cloud/bytebuddy/SimulateMain.java index 453c53b6f8..f46e1eeffd 100644 --- a/skywalking-api/src/test/java/test/ai/cloud/bytebuddy/SimulateMain.java +++ b/skywalking-api/src/test/java/test/ai/cloud/bytebuddy/SimulateMain.java @@ -1,49 +1,53 @@ package test.ai.cloud.bytebuddy; -import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.isConstructor; +import static net.bytebuddy.matcher.ElementMatchers.isMethod; import net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.ClassFileLocator; import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import net.bytebuddy.implementation.MethodDelegation; +import net.bytebuddy.implementation.SuperMethodCall; import net.bytebuddy.pool.TypePool; public class SimulateMain { public static void main(String[] args) throws NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException { TypePool typePool = TypePool.Default.ofClassPath(); - - Object newClazzObj = new ByteBuddy() - .redefine( - typePool.describe( - "test.ai.cloud.bytebuddy.TestClass") - .resolve(), - ClassFileLocator.ForClassLoader.ofClassPath()) - .name("test.ai.cloud.bytebuddy.TestClass$$Origin") - .make() - .load(ClassLoader.getSystemClassLoader(), - ClassLoadingStrategy.Default.INJECTION).getLoaded().newInstance(); - TestClass t22 = (TestClass)(new ByteBuddy() - .subclass(newClazzObj.getClass()) - .method(named("testA")) - .intercept(MethodDelegation.to(new Interceptor())) + Class newClazz = new ByteBuddy() + .redefine( + typePool.describe("test.ai.cloud.bytebuddy.TestClass") + .resolve(), + ClassFileLocator.ForClassLoader.ofClassPath()) + .name("test.ai.cloud.bytebuddy.TestClass$$Origin") + .make() + .load(ClassLoader.getSystemClassLoader(), + ClassLoadingStrategy.Default.INJECTION).getLoaded(); + + TestClass t22 = (TestClass) (new ByteBuddy() + .subclass(newClazz) + .method(isMethod()) + .intercept(MethodDelegation.to(new MethodInterceptor())) + .constructor(isConstructor()) + .intercept(MethodDelegation.to(new ConstructorInterceptor()).andThen(SuperMethodCall.INSTANCE)) .name("test.ai.cloud.bytebuddy.TestClass") .make() .load(ClassLoader.getSystemClassLoader(), - ClassLoadingStrategy.Default.INJECTION).getLoaded().newInstance()); + ClassLoadingStrategy.Default.INJECTION).getLoaded() + .newInstance()); - //System.out.println(t22.testA("1")); - - TestClass t = new TestClass(); + // System.out.println(t22.testA("1")); + TestClass t = new TestClass("abc"); System.out.println(t.testA("1")); - - TestClass t2 = null; - try { - t2 = (TestClass)Class.forName("test.ai.cloud.bytebuddy.TestClass").newInstance(); - } catch (ClassNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - System.out.println(t2.testA("1")); + +// TestClass t2 = null; +// try { +// t2 = (TestClass) Class.forName("test.ai.cloud.bytebuddy.TestClass") +// .newInstance(); +// } catch (ClassNotFoundException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } +// System.out.println(t2.testA("1")); } } diff --git a/skywalking-api/src/test/java/test/ai/cloud/bytebuddy/TestClass.java b/skywalking-api/src/test/java/test/ai/cloud/bytebuddy/TestClass.java index 4a2129badd..7740bc3b15 100644 --- a/skywalking-api/src/test/java/test/ai/cloud/bytebuddy/TestClass.java +++ b/skywalking-api/src/test/java/test/ai/cloud/bytebuddy/TestClass.java @@ -1,6 +1,15 @@ package test.ai.cloud.bytebuddy; public class TestClass { + public TestClass(){ + //System.out.println("init:" + this.getClass().getName()); + } + + public TestClass(String tmp){ + //System.out.println("init:" + this.getClass().getName()); + } + + public String testA(String aa){ // throw new RuntimeException("adfasdfas"); return "TestClass.testA"; -- GitLab