提交 303cc1ca 编写于 作者: wu-sheng's avatar wu-sheng 提交者: GitHub

Merge pull request #345 from ascrutae/zhangxin/fix/hierarchy-match-failed

fix issue that the match of HierarchyMatch do not work
package org.skywalking.apm.agent.core.plugin.match;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.description.type.TypeList;
import net.bytebuddy.matcher.ElementMatcher;
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
......@@ -28,24 +32,54 @@ public class HierarchyMatch implements IndirectMatch {
ElementMatcher.Junction junction = null;
for (String superTypeName : parentTypes) {
if (junction == null) {
junction = buildEachAnnotation(superTypeName);
junction = buildSuperClassMatcher(superTypeName);
} else {
junction = junction.and(buildEachAnnotation(superTypeName));
junction = junction.and(buildSuperClassMatcher(superTypeName));
}
}
junction = junction.and(not(isInterface()));
return junction;
}
private ElementMatcher.Junction buildEachAnnotation(String superTypeName) {
private ElementMatcher.Junction buildSuperClassMatcher(String superTypeName) {
return hasSuperType(named(superTypeName));
}
@Override
public boolean isMatch(TypeDescription typeDescription) {
List<String> parentTypes = new ArrayList<String>(Arrays.asList(this.parentTypes));
TypeList.Generic implInterfaces = typeDescription.getInterfaces();
for (TypeDescription.Generic implInterface : implInterfaces) {
matchHierarchyClass(implInterface, parentTypes);
}
matchHierarchyClass(typeDescription.getSuperClass(), parentTypes);
if (parentTypes.size() == 0) {
return true;
}
return false;
}
private void matchHierarchyClass(TypeDescription.Generic clazz, List<String> parentTypes) {
parentTypes.remove(clazz.getTypeName());
if (parentTypes.size() == 0) {
return;
}
for (TypeDescription.Generic generic : clazz.getInterfaces()) {
matchHierarchyClass(generic, parentTypes);
}
TypeDescription.Generic superClazz = clazz.getSuperClass();
if (superClazz != null && !clazz.getTypeName().equals("java.lang.Object")) {
matchHierarchyClass(superClazz, parentTypes);
}
}
public static ClassMatch byHierarchyMatch(String[] parentTypes) {
return new HierarchyMatch(parentTypes);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册