package jdepend.parse.impl; import org.apache.bcel.Const; import jdepend.metadata.InvokeItem; import jdepend.metadata.JavaPackage; import jdepend.metadata.LocalInvokeItem; import jdepend.metadata.Method; /** * 普通方法读取器 * * @author user * */ public class GeneralMethodReader extends MethodReader { private PackageFilter filter; public GeneralMethodReader(Method method, PackageFilter filter) { super(method); this.filter = filter; } @Override protected void readInfo(int opcode, String info) { String[] infos; int pos; int pos2; String calledPlace; String calledName; String calledPackageName; String calledMethod; String calledMethodSignature; String callType; int index; String fieldName; if (opcode == Const.INVOKEVIRTUAL || opcode == Const.INVOKESPECIAL || opcode == Const.INVOKENONVIRTUAL || opcode == Const.INVOKESTATIC || opcode == Const.INVOKEINTERFACE || opcode == Const.INVOKEDYNAMIC) { infos = info.split("\\s+"); if (infos.length > 1) { pos = infos[1].lastIndexOf('.'); if (pos != -1) { callType = infos[0].substring(6); calledName = infos[1].substring(0, pos); pos2 = infos[1].indexOf(':'); calledMethod = infos[1].substring(pos + 1, pos2); calledMethodSignature = infos[1].substring(pos2 + 1); calledPlace = method.getJavaClass().getPlace(); // 得到包名 index = calledName.lastIndexOf('.'); if (index > 0) { calledPackageName = calledName.substring(0, index); } else { calledPackageName = JavaPackage.Default; } if (filter.accept(calledPackageName) && filter.acceptClass(calledName)) { InvokeItem item = new LocalInvokeItem(callType, calledPlace, calledName, calledMethod, calledMethodSignature); method.addInvokeItem(item); } } } } else if (opcode == Const.GETFIELD) { fieldName = this.getFieldName(info); if (fieldName != null) { method.addReadField(fieldName); } } else if (opcode == Const.PUTFIELD) { fieldName = this.getFieldName(info); if (fieldName != null) { method.addWriteField(fieldName); } } } private String getFieldName(String info) { String[] infos = info.split("\\s+"); if (infos.length > 1) { int pos = infos[1].lastIndexOf('.'); if (pos != -1) { return infos[1].substring(pos + 1, infos[1].indexOf(':')); } else { return null; } } else { return null; } } }