package jdepend.knowledge.pattern.impl1; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import jdepend.knowledge.pattern.PatternInfo; import jdepend.metadata.InvokeItem; import jdepend.metadata.JavaClass; import jdepend.metadata.Method; import jdepend.model.JavaClassUnit; public class ProxyIdentifyer extends AbstractPatternIdentifyer { @Override public String getExplain() { StringBuilder explain = new StringBuilder(); explain.append("    <strong>代理模式</strong><br>"); explain.append("    1、存在父类;2、父类存在其他子类;3、存在覆盖了父类的方法;4、方法使用了其他子类的相同方法。<br><br>"); return explain.toString(); } @Override public Collection<PatternInfo> identify(Collection<JavaClassUnit> javaClasses) { Collection<JavaClass> superClasses; Collection<JavaClass> otherSubClasses; Collection<PatternInfo> rtn = new ArrayList<PatternInfo>(); PatternInfo rtnItem; for (JavaClassUnit javaClass : javaClasses) { // 计算存在父类的JavaClasses superClasses = javaClass.getJavaClass().getSupers(); if (superClasses != null && superClasses.size() > 0) { otherSubClasses = new HashSet<JavaClass>(); M: for (JavaClass superClass : superClasses) { for (JavaClass subClass : superClass.getSubClasses()) { if (!subClass.equals(javaClass) && !otherSubClasses.contains(subClass)) { otherSubClasses.add(subClass); } } } if (otherSubClasses.size() > 0) { // 搜索代理方法 L: for (Method method : javaClass.getJavaClass().getOverrideMethods()) { for (InvokeItem item : method.getInvokeItems()) { if (otherSubClasses.contains(item.getCallee().getJavaClass())) { for (Method superMethod : javaClass.getJavaClass().getOverridedMethods(method)) { if (item.math2(superMethod)) { rtnItem = new PatternInfo(javaClass.getJavaClass(), javaClass.getName() + "." + item.getCallee().getName()); if (!rtn.contains(rtnItem)) { rtn.add(rtnItem); } break L; } } } } } } } } return rtn; } }