From d635a4aff651cf900c4881e3350a1f834feb0bce Mon Sep 17 00:00:00 2001 From: wusheng Date: Fri, 11 Mar 2016 17:27:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=A7=E9=87=8F=E7=9A=84?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E7=BB=93=E6=9E=84=EF=BC=8C=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E5=AF=B9=E7=B1=BB=E7=9A=84=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=EF=BC=8C=E4=BB=A5=E5=8F=8A=E5=AE=9E=E4=BE=8B=E7=BA=A7=E4=B8=8A?= =?UTF-8?q?=E4=B8=8B=E6=96=87=E5=AD=98=E5=82=A8=E3=80=82#36?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interceptor/EnhanceClazz4Interceptor.java | 13 ++++++++++++- .../EnhancedClassInstanceContext.java | 18 ++++++++++++++++++ .../plugin/interceptor/IAroundInterceptor.java | 11 +++++++++++ .../IEnhancedClassInstanceContext.java | 12 ++++++++++++ .../plugin/interceptor/InterceptorDefine.java | 9 +++++++++ .../test/ai/cloud/bytebuddy/SimulateMain.java | 5 ++++- 6 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/EnhancedClassInstanceContext.java create mode 100644 skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/IAroundInterceptor.java create mode 100644 skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/IEnhancedClassInstanceContext.java create mode 100644 skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptorDefine.java diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/EnhanceClazz4Interceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/EnhanceClazz4Interceptor.java index 3ede5e498b..dea5379147 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/EnhanceClazz4Interceptor.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/EnhanceClazz4Interceptor.java @@ -36,7 +36,10 @@ public class EnhanceClazz4Interceptor { } } - private void enhance0(String enhanceOriginClassName) { + private void enhance0(String interceptorDefineClassName) throws InstantiationException, IllegalAccessException, ClassNotFoundException { + InterceptorDefine define = (InterceptorDefine)Class.forName(interceptorDefineClassName).newInstance(); + + String enhanceOriginClassName = define.getBeInterceptedClassName(); /** * add '$$Origin' at the end of be enhanced classname
* such as: class com.ai.cloud.TestClass to class com.ai.cloud.TestClass$$Origin @@ -48,5 +51,13 @@ public class EnhanceClazz4Interceptor { .make() .load(ClassLoader.getSystemClassLoader(), ClassLoadingStrategy.Default.INJECTION).getLoaded(); + + /** + * define class as origin class name. and inject to classloader.
+ * new class need:
+ * 1.implement com.ai.cloud.skywalking.plugin.interceptor.IEnhancedClassInstanceContext();
+ * 2.add field '_$EnhancedClassInstanceContext' of type EnhancedClassInstanceContext + * 3.intercept constructor and method if required by interceptorDefineClass + */ } } diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/EnhancedClassInstanceContext.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/EnhancedClassInstanceContext.java new file mode 100644 index 0000000000..f15ceff301 --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/EnhancedClassInstanceContext.java @@ -0,0 +1,18 @@ +package com.ai.cloud.skywalking.plugin.interceptor; + +import java.util.HashMap; +import java.util.Map; + +/** + * 被增强的类实例,需扩展的context属性,用于在不同的方法,或者构造函数间保存实例 + * + * @author wusheng + * + */ +public class EnhancedClassInstanceContext { + public static final String FIELD_NAME = "_$EnhancedClassInstanceContext"; + + private Map context = new HashMap(); + + +} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/IAroundInterceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/IAroundInterceptor.java new file mode 100644 index 0000000000..861fc41072 --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/IAroundInterceptor.java @@ -0,0 +1,11 @@ +package com.ai.cloud.skywalking.plugin.interceptor; + +public interface IAroundInterceptor { + public void onConstruct(EnhancedClassInstanceContext context); + + public void beforeMethod(EnhancedClassInstanceContext context); + + public void afterMethod(EnhancedClassInstanceContext context); + + +} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/IEnhancedClassInstanceContext.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/IEnhancedClassInstanceContext.java new file mode 100644 index 0000000000..fa7fccd50f --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/IEnhancedClassInstanceContext.java @@ -0,0 +1,12 @@ +package com.ai.cloud.skywalking.plugin.interceptor; + +/** + * 被增强的类,会实现此接口,用于快速获取实例级属性上下文扩展
+ * @see com.ai.cloud.skywalking.plugin.interceptor.EnhanceClazz4Interceptor.enhance0() + * + * @author wusheng + * + */ +public interface IEnhancedClassInstanceContext { + public EnhancedClassInstanceContext getEnhancedClassInstanceContext(); +} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptorDefine.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptorDefine.java new file mode 100644 index 0000000000..c510105067 --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptorDefine.java @@ -0,0 +1,9 @@ +package com.ai.cloud.skywalking.plugin.interceptor; + +public interface InterceptorDefine { + public String getBeInterceptedClassName(); + + public String[] getBeInterceptedMethods(); + + public IAroundInterceptor instance(); +} 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 f46e1eeffd..e2e763ca57 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 @@ -11,7 +11,7 @@ import net.bytebuddy.pool.TypePool; public class SimulateMain { public static void main(String[] args) throws NoSuchFieldException, - SecurityException, InstantiationException, IllegalAccessException { + SecurityException, InstantiationException, IllegalAccessException, ClassNotFoundException { TypePool typePool = TypePool.Default.ofClassPath(); Class newClazz = new ByteBuddy() @@ -39,6 +39,9 @@ public class SimulateMain { // System.out.println(t22.testA("1")); TestClass t = new TestClass("abc"); System.out.println(t.testA("1")); + + t = new TestClass("abc"); + System.out.println(t.testA("1")); // TestClass t2 = null; // try { -- GitLab