Package com.mebigfatguy.fbcontrib.detect
Class ClassEnvy
java.lang.Object
edu.umd.cs.findbugs.visitclass.BetterVisitor
edu.umd.cs.findbugs.visitclass.PreorderVisitor
edu.umd.cs.findbugs.visitclass.AnnotationVisitor
edu.umd.cs.findbugs.visitclass.DismantleBytecode
edu.umd.cs.findbugs.BytecodeScanningDetector
com.mebigfatguy.fbcontrib.detect.ClassEnvy
- All Implemented Interfaces:
edu.umd.cs.findbugs.Detector,edu.umd.cs.findbugs.Priorities,org.apache.bcel.classfile.Visitor
public class ClassEnvy
extends edu.umd.cs.findbugs.BytecodeScanningDetector
finds methods that excessively use methods from another class. This probably
means these methods should be defined in that other class.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final Comparator<Map.Entry<String, BitSet>> private final edu.umd.cs.findbugs.BugReporterprivate Stringprivate static final doubleprivate static final intprivate static final Stringprivate doubleprivate booleanprivate Stringprivate intprivate Stringprivate Stringprivate edu.umd.cs.findbugs.OpcodeStackprivate intFields inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode
codeBytes, lineNumberTable, M_BR, M_CP, M_INT, M_PAD, M_R, M_UINTFields inherited from interface edu.umd.cs.findbugs.Priorities
EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY -
Constructor Summary
ConstructorsConstructorDescriptionClassEnvy(edu.umd.cs.findbugs.BugReporter bugReporter) constructs a CE detector given the reporter to report bugs on -
Method Summary
Modifier and TypeMethodDescriptionprivate voidaddLineNumber(BitSet lineNumbers) add the current line number to a set of line numbersprivate booleancountClassAccess(int classAtStackIndex) increment the count of class access of the class on the stackprivate voidcountClassAccess(String calledClass) increment the count of class access of the specified class if it is in a similar package to the caller, and is not general purposeprivate booleangeneralPurpose(String className) checks to see if the specified class is a built in class, or implements a simple interfaceprivate booleanreturn whether or not a class implements a common or marker interfaceprivate booleanisAssociatedClass(String calledClass) returns whether the called class is an inner class, or super class of the current classvoidsawOpcode(int seen) overrides the visitor to look for method calls, and populate a class access count map based on the owning class of methods called.voidvisitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext) overrides the visitor to collect package and class namesvoidvisitCode(org.apache.bcel.classfile.Code obj) overrides the visitor to look for the method that uses another class the most, and if it exceeds the threshold reports itvoidvisitMethod(org.apache.bcel.classfile.Method obj) overrides the visitor to check whether the method is staticMethods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector
getClassContext, report, shouldVisitCodeMethods inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode
afterOpcode, areOppositeBranches, atCatchBlock, beforeOpcode, getBranchFallThrough, getBranchOffset, getBranchTarget, getClassConstantOperand, getClassDescriptorOperand, getCodeByte, getConstantRefOperand, getDefaultSwitchOffset, getDottedClassConstantOperand, getFieldDescriptorOperand, getIntConstant, getLongConstant, getMaxPC, getMethodDescriptorOperand, getNameConstantOperand, getNextCodeByte, getNextOpcode, getNextPC, getOpcode, getPC, getPrevOpcode, getRefConstantOperand, getRefFieldIsStatic, getRegisterOperand, getSigConstantOperand, getStringConstantOperand, getSwitchLabels, getSwitchOffsets, getXClassOperand, getXFieldOperand, getXMethodOperand, isBranch, isMethodCall, isRegisterLoad, isRegisterStore, isRegisterStore, isReturn, isShift, isSwitch, isWideOpcode, printOpCode, sawBranchTo, sawClass, sawDouble, sawField, sawFloat, sawIMethod, sawInt, sawLong, sawMethod, sawRegister, sawString, visitMethods inherited from class edu.umd.cs.findbugs.visitclass.AnnotationVisitor
getAnnotationParameterAsEnum, getAnnotationParameterAsString, getAnnotationParameterAsStringArray, visitAnnotation, visitAnnotation, visitParameterAnnotation, visitParameterAnnotation, visitSyntheticParameterAnnotationMethods inherited from class edu.umd.cs.findbugs.visitclass.PreorderVisitor
amVisitingMainMethod, asUnsignedByte, doVisitMethod, getClassDescriptor, getClassName, getCode, getConstantPool, getDottedClassName, getDottedFieldSig, getDottedMethodSig, getDottedSuperclassName, getField, getFieldDescriptor, getFieldIsStatic, getFieldName, getFieldSig, getFullyQualifiedFieldName, getFullyQualifiedMethodName, getMethod, getMethodDescriptor, getMethodName, getMethodSig, getMethodVisitOrder, getNumberArguments, getNumberMethodArguments, getPackageName, getSizeOfSurroundingTryBlock, getSizeOfSurroundingTryBlock, getSourceFile, getStringFromIndex, getSuperclassName, getSurroundingCaughtExceptions, getSurroundingCaughtExceptions, getSurroundingCaughtExceptionTypes, getSurroundingTryBlock, getSurroundingTryBlock, getThisClass, getXClass, getXField, getXMethod, hasInterestingClass, hasInterestingMethod, isVisitMethodsInCallOrder, setupVisitorForClass, setVisitMethodsInCallOrder, shouldVisit, toString, visitAfter, visitAfter, visitAnnotationDefault, visitAnnotationEntry, visitBootstrapMethods, visitConstantInvokeDynamic, visitConstantMethodHandle, visitConstantMethodType, visitConstantModule, visitConstantPackage, visitConstantPool, visitEnclosingMethod, visitingField, visitingMethod, visitInnerClasses, visitJavaClass, visitLineNumberTable, visitLocalVariableTable, visitMethodParameters, visitParameterAnnotationEntry, visitStackMap, visitStackMapEntryMethods inherited from class edu.umd.cs.findbugs.visitclass.BetterVisitor
clone, report, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visitCodeException, visitConstantClass, visitConstantDouble, visitConstantFieldref, visitConstantFloat, visitConstantInteger, visitConstantInterfaceMethodref, visitConstantLong, visitConstantMethodref, visitConstantNameAndType, visitConstantString, visitConstantUtf8, visitConstantValue, visitDeprecated, visitExceptionTable, visitField, visitInnerClass, visitLineNumber, visitLocalVariable, visitLocalVariableTypeTable, visitSignature, visitSourceFile, visitSynthetic, visitUnknownMethods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface org.apache.bcel.classfile.Visitor
visitConstantDynamic, visitMethodParameter, visitModule, visitModuleExports, visitModuleMainClass, visitModuleOpens, visitModulePackages, visitModuleProvides, visitModuleRequires, visitNestHost, visitNestMembers, visitRecord, visitRecordComponent, visitStackMapType
-
Field Details
-
DEFAULT_ENVY_PERCENT
private static final double DEFAULT_ENVY_PERCENT- See Also:
-
DEFAULT_MIN_ENVY
private static final int DEFAULT_MIN_ENVY- See Also:
-
ENVY_PERCENT_PROPERTY
- See Also:
-
ignorableInterfaces
-
ACCESS_COUNT_COMPARATOR
-
bugReporter
private final edu.umd.cs.findbugs.BugReporter bugReporter -
stack
private edu.umd.cs.findbugs.OpcodeStack stack -
packageName
-
clsName
-
parentClassName
-
clsAccessCount
-
thisClsAccessCount
private int thisClsAccessCount -
methodName
-
methodIsStatic
private boolean methodIsStatic -
envyPercent
private double envyPercent -
minEnvy
private int minEnvy
-
-
Constructor Details
-
ClassEnvy
public ClassEnvy(edu.umd.cs.findbugs.BugReporter bugReporter) constructs a CE detector given the reporter to report bugs on- Parameters:
bugReporter- the sync of bug reports
-
-
Method Details
-
visitClassContext
public void visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext) overrides the visitor to collect package and class names- Specified by:
visitClassContextin interfaceedu.umd.cs.findbugs.Detector- Overrides:
visitClassContextin classedu.umd.cs.findbugs.BytecodeScanningDetector- Parameters:
classContext- the context object that holds the JavaClass being parsed
-
visitMethod
public void visitMethod(org.apache.bcel.classfile.Method obj) overrides the visitor to check whether the method is static- Specified by:
visitMethodin interfaceorg.apache.bcel.classfile.Visitor- Overrides:
visitMethodin classedu.umd.cs.findbugs.visitclass.BetterVisitor- Parameters:
obj- the method currently being parsed
-
visitCode
public void visitCode(org.apache.bcel.classfile.Code obj) overrides the visitor to look for the method that uses another class the most, and if it exceeds the threshold reports it- Specified by:
visitCodein interfaceorg.apache.bcel.classfile.Visitor- Overrides:
visitCodein classedu.umd.cs.findbugs.visitclass.PreorderVisitor- Parameters:
obj- the code that is currently being parsed
-
sawOpcode
public void sawOpcode(int seen) overrides the visitor to look for method calls, and populate a class access count map based on the owning class of methods called.- Overrides:
sawOpcodein classedu.umd.cs.findbugs.visitclass.DismantleBytecode- Parameters:
seen- the opcode currently being parsed
-
implementsCommonInterface
return whether or not a class implements a common or marker interface- Parameters:
name- the class name to check- Returns:
- if this class implements a common or marker interface
-
countClassAccess
private boolean countClassAccess(int classAtStackIndex) increment the count of class access of the class on the stack- Parameters:
classAtStackIndex- the position on the stack of the class in question- Returns:
- true if the class is counted
-
countClassAccess
increment the count of class access of the specified class if it is in a similar package to the caller, and is not general purpose- Parameters:
calledClass- the class to check
-
isAssociatedClass
returns whether the called class is an inner class, or super class of the current class- Parameters:
calledClass- the class to check- Returns:
- if the class is related to this class
-
addLineNumber
add the current line number to a set of line numbers- Parameters:
lineNumbers- the current set of line numbers
-
generalPurpose
checks to see if the specified class is a built in class, or implements a simple interface- Parameters:
className- the class in question- Returns:
- whether or not the class is general purpose
-