提交 5f4fe494 编写于 作者: wu-sheng's avatar wu-sheng 提交者: GitHub

Merge pull request #193 from wu-sheng/feature/192

Support multi plugins for one target class
......@@ -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 <code>null</code> 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;
}
}
}
......
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<String, AbstractClassEnhancePluginDefine> pluginDefineMap = new HashMap<String, AbstractClassEnhancePluginDefine>();
private final Map<String, LinkedList<AbstractClassEnhancePluginDefine>> pluginDefineMap = new HashMap<String, LinkedList<AbstractClassEnhancePluginDefine>>();
public PluginFinder(List<AbstractClassEnhancePluginDefine> plugins) {
for (AbstractClassEnhancePluginDefine plugin : plugins) {
......@@ -21,11 +22,17 @@ public class PluginFinder {
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)) {
return pluginDefineMap.get(enhanceClassName);
}
......
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<AbstractClassEnhancePluginDefine> 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) {
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册