From 904d0cb205456712a43d2478a21b8a170a3002ee Mon Sep 17 00:00:00 2001 From: wusheng Date: Mon, 14 Mar 2016 16:48:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E3=80=82=E5=AE=8C=E5=96=84context=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E3=80=82#36?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClassConstructorInterceptor.java | 13 +++---------- .../interceptor/EnhanceClazz4Interceptor.java | 9 +++------ .../EnhancedClassInstanceContext.java | 19 +++++++++++++++++-- .../plugin/interceptor/FieldGetter.java | 5 +++++ .../plugin/interceptor/FieldSetter.java | 5 +++++ .../interceptor/InterceptorContext.java | 4 ++++ .../plugin/interceptor/InterceptorDefine.java | 16 ++++++++++++++++ .../cloud/plugin/TestAroundInterceptor.java | 5 +++-- 8 files changed, 56 insertions(+), 20 deletions(-) create mode 100644 skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/FieldGetter.java create mode 100644 skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/FieldSetter.java diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ClassConstructorInterceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ClassConstructorInterceptor.java index 10b2cf445..34563d0ea 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ClassConstructorInterceptor.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ClassConstructorInterceptor.java @@ -24,21 +24,14 @@ public class ClassConstructorInterceptor { @FieldProxy(EnhanceClazz4Interceptor.contextAttrName) FieldSetter accessor, @AllArguments Object[] allArguments) { try { - accessor.setValue(new EnhancedClassInstanceContext()); + EnhancedClassInstanceContext context = new EnhancedClassInstanceContext(); + accessor.setValue(context); ConstructorContext interceptorContext = new ConstructorContext( allArguments); - interceptor.onConstruct(null, interceptorContext); + interceptor.onConstruct(context, interceptorContext); } catch (Throwable t) { logger.error("ClassConstructorInterceptor failue.", t); } } - - public interface FieldGetter { - Object getValue(); - } - - public interface FieldSetter { - void setValue(Object value); - } } 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 e4116fcbb..d9c3a5e5f 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 @@ -19,8 +19,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.ai.cloud.skywalking.plugin.PluginCfg; -import com.ai.cloud.skywalking.plugin.interceptor.ClassConstructorInterceptor.FieldGetter; -import com.ai.cloud.skywalking.plugin.interceptor.ClassConstructorInterceptor.FieldSetter; public class EnhanceClazz4Interceptor { private static Logger logger = LogManager @@ -76,15 +74,14 @@ public class EnhanceClazz4Interceptor { ClassLoadingStrategy.Default.INJECTION).getLoaded(); /** - * to classloader.
+ * create a new class using origin classname.
* * new class need:
* 1.add field '_$EnhancedClassInstanceContext' of type * EnhancedClassInstanceContext
* - * 2.intercept constructor and method if required by - * interceptorDefineClass. use '@FieldValue' get - * '_$EnhancedClassInstanceContext' ref
+ * 2.intercept constructor by default, and intercept method which it's required by + * interceptorDefineClass.
*/ IAroundInterceptor interceptor = define.instance(); 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 index f15ceff30..8a382a529 100644 --- 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 @@ -1,7 +1,7 @@ package com.ai.cloud.skywalking.plugin.interceptor; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * 被增强的类实例,需扩展的context属性,用于在不同的方法,或者构造函数间保存实例 @@ -12,7 +12,22 @@ import java.util.Map; public class EnhancedClassInstanceContext { public static final String FIELD_NAME = "_$EnhancedClassInstanceContext"; - private Map context = new HashMap(); + private Map context = new ConcurrentHashMap(); + public void set(Object key, Object value){ + context.put(key, value); + } + public Object get(Object key){ + return context.get(key); + } + + public boolean isContain(Object key){ + return context.containsKey(key); + } + + @SuppressWarnings("unchecked") + public T get(Object key, Class type){ + return (T)this.get(key); + } } diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/FieldGetter.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/FieldGetter.java new file mode 100644 index 000000000..377556ce8 --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/FieldGetter.java @@ -0,0 +1,5 @@ +package com.ai.cloud.skywalking.plugin.interceptor; + +public interface FieldGetter { + Object getValue(); +} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/FieldSetter.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/FieldSetter.java new file mode 100644 index 000000000..22038757f --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/FieldSetter.java @@ -0,0 +1,5 @@ +package com.ai.cloud.skywalking.plugin.interceptor; + +public interface FieldSetter { + void setValue(Object value); +} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptorContext.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptorContext.java index 15a82da71..ce57108bb 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptorContext.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptorContext.java @@ -16,6 +16,10 @@ public class InterceptorContext { return this.allArguments; } + public String methodName(){ + return methodName; + } + public Object inst(){ return objInst; } 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 index c51010506..948c75906 100644 --- 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 @@ -1,9 +1,25 @@ package com.ai.cloud.skywalking.plugin.interceptor; public interface InterceptorDefine { + /** + * 返回要被增强的类,应当返回类全名 + * + * @return + */ public String getBeInterceptedClassName(); + /** + * 返回需要被增强的方法列表 + * + * @return + */ public String[] getBeInterceptedMethods(); + /** + * 返回增强拦截器的实现
+ * 每个拦截器在同一个被增强类的内部,保持单例 + * + * @return + */ public IAroundInterceptor instance(); } diff --git a/skywalking-api/src/test/java/test/ai/cloud/plugin/TestAroundInterceptor.java b/skywalking-api/src/test/java/test/ai/cloud/plugin/TestAroundInterceptor.java index 0f9455f70..f822e0ff8 100644 --- a/skywalking-api/src/test/java/test/ai/cloud/plugin/TestAroundInterceptor.java +++ b/skywalking-api/src/test/java/test/ai/cloud/plugin/TestAroundInterceptor.java @@ -9,17 +9,18 @@ public class TestAroundInterceptor implements IAroundInterceptor { @Override public void onConstruct(EnhancedClassInstanceContext context, ConstructorContext interceptorContext) { + context.set("test.key", "123"); System.out.println("onConstruct, args size=" + interceptorContext.allArguments().length); } @Override public void beforeMethod(EnhancedClassInstanceContext context, InterceptorContext interceptorContext) { - System.out.println("beforeMethod : " + context); + System.out.println("beforeMethod : " + context.get("test.key", String.class)); } @Override public void afterMethod(EnhancedClassInstanceContext context, InterceptorContext interceptorContext) { - System.out.println("afterMethod: " + context); + System.out.println("afterMethod: " + context.get("test.key", String.class)); } }