package jdepend.util.analyzer.element; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import jdepend.metadata.InvokeItem; import jdepend.metadata.Method; import jdepend.model.JavaClassUnit; import jdepend.model.result.AnalysisResult; import jdepend.util.analyzer.framework.AbstractAnalyzer; import jdepend.util.analyzer.framework.Analyzer; import jdepend.util.analyzer.framework.AnalyzerException; public final class IdentifyWillMoveMethod extends AbstractAnalyzer { /** * */ private static final long serialVersionUID = 981733240201462312L; public IdentifyWillMoveMethod() { super("MoveMethod分析", Analyzer.Attention, "识别有移动倾向的Method"); } @Override protected void doExecute(AnalysisResult result) throws AnalyzerException { Map<Method, String> moveInfos = new LinkedHashMap<Method, String>(); String invokeClassName; List<String> invokeMethods; boolean sameInvokeClass; boolean selfInvokeClass; for (JavaClassUnit javaClass : result.getClasses()) { for (Method method : javaClass.getJavaClass().getSelfMethods()) { if (method.getSelfLineCount() > 10) { if (method.getWriteFields().size() == 0 && method.getReadFields().size() == 0) { invokeClassName = null; invokeMethods = new ArrayList<String>(); sameInvokeClass = true; selfInvokeClass = false; L: for (InvokeItem invokeItem : method.getInvokeItems()) { if (!invokeItem.getCallee().getJavaClass().equals(method.getJavaClass())) { if (invokeClassName != null && !invokeClassName.equals(invokeItem.getCallee().getJavaClass().getName())) { sameInvokeClass = false; break L; } else if (invokeClassName == null) { invokeClassName = invokeItem.getCallee().getJavaClass().getName(); } invokeMethods.add(invokeItem.getCallee().getName()); } else { selfInvokeClass = true; break L; } } if (invokeClassName != null && sameInvokeClass && !selfInvokeClass) { if (invokeMethods.size() == 1) { moveInfos.put(method, invokeClassName + "." + invokeMethods.get(0)); } else { moveInfos.put(method, invokeClassName); } } } } } } this.isPrintTab(false); this.print("以下列出的方法与源类中的属性和方法没有关系,而与目标类中的方法存在调用关系:\n"); for (Method method : moveInfos.keySet()) { this.print("建议将JavaClass[" + method.getJavaClass().getName() + "." + method.getName() + "]移动到[" + moveInfos.get(method) + "]中\n"); } } @Override public String getExplain() { StringBuilder explain = new StringBuilder(); explain.append("识别孤立的方法,并为其找到宿主。<br>"); return explain.toString(); } }