1 4 package com.puppycrawl.tools.checkstyle.bcel.checks; 5 6 import java.util.Iterator ; 7 import java.util.Set ; 8 9 import org.apache.bcel.classfile.JavaClass; 10 import org.apache.bcel.classfile.Method; 11 import org.apache.bcel.generic.Type; 12 import com.puppycrawl.tools.checkstyle.api.Scope; 13 import com.puppycrawl.tools.checkstyle.bcel.ReferenceVisitor; 14 15 19 public class HiddenStaticMethodCheck 20 extends AbstractReferenceCheck 21 { 22 23 public void setScope(String aFrom) 24 { 25 super.setScope(aFrom); 26 ((ReferenceVisitor) getVisitor()).addFieldScope( 27 Scope.getInstance(aFrom)); 28 } 29 30 31 public void visitObject(Object aJavaClass) 32 { 33 final JavaClass javaClass = (JavaClass) aJavaClass; 34 final String className = javaClass.getClassName(); 35 final JavaClass[] superClasses = javaClass.getSuperClasses(); 36 final Method[] methods = javaClass.getMethods(); 37 for (int i = 0; i < methods.length; i++) { 39 final Method method = methods[i]; 40 if (!method.isPrivate() && method.isStatic()) { 42 for (int j = 0; j < superClasses.length; j++) { 44 final JavaClass superClass = superClasses[j]; 45 final String superClassName = superClass.getClassName(); 46 final Method[] superClassMethods = superClass.getMethods(); 47 for (int k = 0; k < superClassMethods.length; k++) { 49 final Method superClassMethod = superClassMethods[k]; 50 if (superClassMethod.getName().equals(method.getName()) && 51 !ignore(className, method)) { 52 Type[] methodTypes = method.getArgumentTypes(); 53 Type[] superTypes = superClassMethod. 54 getArgumentTypes(); 55 if (methodTypes.length == superTypes.length) { 56 boolean match = true; 57 for (int arg = 0; arg < methodTypes.length; arg++) { 58 if (!methodTypes[arg].equals(superTypes[arg])) { 59 match = false; 60 } 61 } 62 if (match) { 64 log( 65 javaClass, 66 0, 67 "hidden.static.method", 68 new Object [] {method, superClassName}); 69 } 70 } 71 } 72 } 73 } 74 } 75 } 76 } 77 78 79 public boolean ignore(String aClassName, Method aMethod) { 80 final String methodName = aMethod.getName(); 81 return (methodName.equals("<init>") 83 || methodName.equals("<clinit>") 84 || methodName.equals("class$") 85 || aMethod.toString().indexOf("[Synthetic]") > -1); 86 } 87 88 } 89 | Popular Tags |