//Tested with BCEL-5.1 //http://jakarta.apache.org/builds/jakarta-bcel/release/v5.1/ package com.puppycrawl.tools.checkstyle.bcel.checks; import org.apache.bcel.classfile.Field; import org.apache.bcel.classfile.JavaClass; import com.puppycrawl.tools.checkstyle.api.Scope; import com.puppycrawl.tools.checkstyle.bcel.ReferenceVisitor; /** * Checks for fields that hide fields in superclasses * @author Daniel Grenner */ public class HiddenInheritedFieldCheck extends AbstractReferenceCheck { /** @see AbstractReferenceCheck */ public void setScope(String aFrom) { super.setScope(aFrom); ((ReferenceVisitor) getVisitor()).addFieldScope( Scope.getInstance(aFrom)); } /** @see com.puppycrawl.tools.checkstyle.bcel.IObjectSetVisitor */ public void visitObject(Object aJavaClass) { final JavaClass javaClass = (JavaClass) aJavaClass; final String className = javaClass.getClassName(); final JavaClass[] superClasses = javaClass.getSuperClasses(); final Field[] fields = javaClass.getFields(); // Check all fields for (int i = 0; i < fields.length; i++) { final Field field = fields[i]; // Go through all superclasses for (int j = 0; j < superClasses.length; j++) { final JavaClass superClass = superClasses[j]; final String superClassName = superClass.getClassName(); final Field[] superClassFields = superClass.getFields(); // Go through the filds of the superclasses for (int k = 0; k < superClassFields.length; k++) { final Field superClassField = superClassFields[k]; if (!superClassField.isPrivate() && superClassField.getName().equals(field.getName()) && !ignore(className, field)) { log( javaClass, 0, "hidden.inherited.field", new Object[] {fields[i], superClassName}); } } } } } /** @see AbstractReferenceCheck */ public boolean ignore(String aClassName, Field aField) { final String fieldName = aField.toString(); return (/*super.ignore(aClassName, aField) || */fieldName.indexOf("[Synthetic]") > -1); } }