diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/AbstractClassEnhancePluginDefine.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/AbstractClassEnhancePluginDefine.java
index 2c16b2866..f4cda7556 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/AbstractClassEnhancePluginDefine.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/AbstractClassEnhancePluginDefine.java
@@ -24,7 +24,7 @@ public abstract class AbstractClassEnhancePluginDefine {
*
* @param transformClassName target class.
* @param builder byte-buddy's builder to manipulate target class's bytecode.
- * @return be defined builder.
+ * @return the new builder, or null if not be enhanced.
* @throws PluginException, when set builder failure.
*/
public DynamicType.Builder> define(String transformClassName,
@@ -33,7 +33,7 @@ public abstract class AbstractClassEnhancePluginDefine {
if (StringUtil.isEmpty(transformClassName)) {
logger.warn("classname of being intercepted is not defined by {}.", interceptorDefineClassName);
- return builder;
+ return null;
}
logger.debug("prepare to enhance class {} by {}.", transformClassName, interceptorDefineClassName);
@@ -48,7 +48,7 @@ public abstract class AbstractClassEnhancePluginDefine {
if (!witnessClassResolution.isResolved()) {
logger.warn("enhance class {} by plugin {} is not working. Because witness class {} is not existed.", transformClassName, interceptorDefineClassName,
witnessClass);
- return builder;
+ return null;
}
}
}
diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginFinder.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginFinder.java
index 2caa7214b..45ce1d5b5 100644
--- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginFinder.java
+++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginFinder.java
@@ -1,6 +1,7 @@
package org.skywalking.apm.agent.core.plugin;
import java.util.HashMap;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -11,7 +12,7 @@ import java.util.Map;
* @author wusheng
*/
public class PluginFinder {
- private final Map pluginDefineMap = new HashMap();
+ private final Map> pluginDefineMap = new HashMap>();
public PluginFinder(List plugins) {
for (AbstractClassEnhancePluginDefine plugin : plugins) {
@@ -21,11 +22,17 @@ public class PluginFinder {
continue;
}
- pluginDefineMap.put(enhanceClassName, plugin);
+ LinkedList pluginDefinesWithSameTarget = pluginDefineMap.get(enhanceClassName);
+ if (pluginDefinesWithSameTarget == null) {
+ pluginDefinesWithSameTarget = new LinkedList();
+ pluginDefineMap.put(enhanceClassName, pluginDefinesWithSameTarget);
+ }
+
+ pluginDefinesWithSameTarget.add(plugin);
}
}
- public AbstractClassEnhancePluginDefine find(String enhanceClassName) {
+ public List find(String enhanceClassName) {
if (pluginDefineMap.containsKey(enhanceClassName)) {
return pluginDefineMap.get(enhanceClassName);
}
diff --git a/apm-sniffer/apm-agent/src/main/java/org/skywalking/apm/agent/SkyWalkingAgent.java b/apm-sniffer/apm-agent/src/main/java/org/skywalking/apm/agent/SkyWalkingAgent.java
index e8afb5d11..2fe77d5ba 100644
--- a/apm-sniffer/apm-agent/src/main/java/org/skywalking/apm/agent/SkyWalkingAgent.java
+++ b/apm-sniffer/apm-agent/src/main/java/org/skywalking/apm/agent/SkyWalkingAgent.java
@@ -1,5 +1,6 @@
package org.skywalking.apm.agent;
+import java.util.List;
import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.description.NamedElement;
import net.bytebuddy.description.type.TypeDescription;
@@ -53,14 +54,22 @@ public class SkyWalkingAgent {
new AgentBuilder.Default().type(enhanceClassMatcher(pluginFinder).and(not(isInterface()))).transform(new AgentBuilder.Transformer() {
public DynamicType.Builder> transform(DynamicType.Builder> builder, TypeDescription typeDescription,
- ClassLoader classLoader) {
- AbstractClassEnhancePluginDefine pluginDefine = pluginFinder.find(typeDescription.getTypeName());
- return pluginDefine.define(typeDescription.getTypeName(), builder);
+ ClassLoader classLoader) {
+ List pluginDefines = pluginFinder.find(typeDescription.getTypeName());
+ for (AbstractClassEnhancePluginDefine pluginDefine : pluginDefines) {
+ DynamicType.Builder> newBuilder = pluginDefine.define(typeDescription.getTypeName(), builder);
+ if (newBuilder != null) {
+ return newBuilder;
+ }
+ }
+
+ logger.warn("Matched class {}, but enhancement fail.", typeDescription.getTypeName());
+ return builder;
}
}).with(new AgentBuilder.Listener() {
@Override
public void onTransformation(TypeDescription typeDescription, ClassLoader classLoader, JavaModule module,
- DynamicType dynamicType) {
+ DynamicType dynamicType) {
}