提交 8b074a0a 编写于 作者: wu-sheng's avatar wu-sheng

Support multi plugins for one target class.

上级 ecf7a2bf
...@@ -24,7 +24,7 @@ public abstract class AbstractClassEnhancePluginDefine { ...@@ -24,7 +24,7 @@ public abstract class AbstractClassEnhancePluginDefine {
* *
* @param transformClassName target class. * @param transformClassName target class.
* @param builder byte-buddy's builder to manipulate target class's bytecode. * @param builder byte-buddy's builder to manipulate target class's bytecode.
* @return be defined builder. * @return the new builder, or <code>null</code> if not be enhanced.
* @throws PluginException, when set builder failure. * @throws PluginException, when set builder failure.
*/ */
public DynamicType.Builder<?> define(String transformClassName, public DynamicType.Builder<?> define(String transformClassName,
...@@ -33,7 +33,7 @@ public abstract class AbstractClassEnhancePluginDefine { ...@@ -33,7 +33,7 @@ public abstract class AbstractClassEnhancePluginDefine {
if (StringUtil.isEmpty(transformClassName)) { if (StringUtil.isEmpty(transformClassName)) {
logger.warn("classname of being intercepted is not defined by {}.", interceptorDefineClassName); logger.warn("classname of being intercepted is not defined by {}.", interceptorDefineClassName);
return builder; return null;
} }
logger.debug("prepare to enhance class {} by {}.", transformClassName, interceptorDefineClassName); logger.debug("prepare to enhance class {} by {}.", transformClassName, interceptorDefineClassName);
...@@ -48,7 +48,7 @@ public abstract class AbstractClassEnhancePluginDefine { ...@@ -48,7 +48,7 @@ public abstract class AbstractClassEnhancePluginDefine {
if (!witnessClassResolution.isResolved()) { if (!witnessClassResolution.isResolved()) {
logger.warn("enhance class {} by plugin {} is not working. Because witness class {} is not existed.", transformClassName, interceptorDefineClassName, logger.warn("enhance class {} by plugin {} is not working. Because witness class {} is not existed.", transformClassName, interceptorDefineClassName,
witnessClass); witnessClass);
return builder; return null;
} }
} }
} }
......
package org.skywalking.apm.agent.core.plugin; package org.skywalking.apm.agent.core.plugin;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -11,7 +12,7 @@ import java.util.Map; ...@@ -11,7 +12,7 @@ import java.util.Map;
* @author wusheng * @author wusheng
*/ */
public class PluginFinder { public class PluginFinder {
private final Map<String, AbstractClassEnhancePluginDefine> pluginDefineMap = new HashMap<String, AbstractClassEnhancePluginDefine>(); private final Map<String, LinkedList<AbstractClassEnhancePluginDefine>> pluginDefineMap = new HashMap<String, LinkedList<AbstractClassEnhancePluginDefine>>();
public PluginFinder(List<AbstractClassEnhancePluginDefine> plugins) { public PluginFinder(List<AbstractClassEnhancePluginDefine> plugins) {
for (AbstractClassEnhancePluginDefine plugin : plugins) { for (AbstractClassEnhancePluginDefine plugin : plugins) {
...@@ -21,11 +22,17 @@ public class PluginFinder { ...@@ -21,11 +22,17 @@ public class PluginFinder {
continue; continue;
} }
pluginDefineMap.put(enhanceClassName, plugin); LinkedList<AbstractClassEnhancePluginDefine> pluginDefinesWithSameTarget = pluginDefineMap.get(enhanceClassName);
if (pluginDefinesWithSameTarget == null) {
pluginDefinesWithSameTarget = new LinkedList<AbstractClassEnhancePluginDefine>();
pluginDefineMap.put(enhanceClassName, pluginDefinesWithSameTarget);
}
pluginDefinesWithSameTarget.add(plugin);
} }
} }
public AbstractClassEnhancePluginDefine find(String enhanceClassName) { public List<AbstractClassEnhancePluginDefine> find(String enhanceClassName) {
if (pluginDefineMap.containsKey(enhanceClassName)) { if (pluginDefineMap.containsKey(enhanceClassName)) {
return pluginDefineMap.get(enhanceClassName); return pluginDefineMap.get(enhanceClassName);
} }
......
package org.skywalking.apm.agent; package org.skywalking.apm.agent;
import java.util.List;
import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.description.NamedElement; import net.bytebuddy.description.NamedElement;
import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.description.type.TypeDescription;
...@@ -54,8 +55,16 @@ public class SkyWalkingAgent { ...@@ -54,8 +55,16 @@ public class SkyWalkingAgent {
new AgentBuilder.Default().type(enhanceClassMatcher(pluginFinder).and(not(isInterface()))).transform(new AgentBuilder.Transformer() { new AgentBuilder.Default().type(enhanceClassMatcher(pluginFinder).and(not(isInterface()))).transform(new AgentBuilder.Transformer() {
public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription,
ClassLoader classLoader) { ClassLoader classLoader) {
AbstractClassEnhancePluginDefine pluginDefine = pluginFinder.find(typeDescription.getTypeName()); List<AbstractClassEnhancePluginDefine> pluginDefines = pluginFinder.find(typeDescription.getTypeName());
return pluginDefine.define(typeDescription.getTypeName(), builder); 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() { }).with(new AgentBuilder.Listener() {
@Override @Override
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册