Package com.mebigfatguy.fbcontrib.detect
Class FindClassCircularDependencies
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.FindClassCircularDependencies
- All Implemented Interfaces:
edu.umd.cs.findbugs.Detector,edu.umd.cs.findbugs.Priorities,org.apache.bcel.classfile.Visitor
public class FindClassCircularDependencies
extends edu.umd.cs.findbugs.BytecodeScanningDetector
looks for classes that have dependencies on each other in a circular way.
Class initialization can be compromised in this scenario, and usually points
to a bad data model. Consider using interfaces to break this hard circular
dependency.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) static classfinds class dependency loops in a directed graph -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final Patternprivate edu.umd.cs.findbugs.BugReporterprivate StringFields 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
ConstructorsConstructorDescriptionFindClassCircularDependencies(edu.umd.cs.findbugs.BugReporter bugReporter) constructs a FCCD detector given the reporter to report bugs on -
Method Summary
Modifier and TypeMethodDescriptiongetDependenciesForClass(String clsName) returns a set of dependent class names for a class, and if it doesn't exist create the set install it, and then return;private booleanisEnclosingClassName(String outerClass, String innerClass) private booleanisStaticChild(String child, String parent) private StringnormalizeArrayClass(String clsName) private voidprivate voidprivate voidprivate booleanremoveLoopLinks(Set<String> loop) voidreport()voidsawOpcode(int seen) voidvisit(org.apache.bcel.classfile.JavaClass obj) voidvisitAnnotation(String annotationClass, Map<String, org.apache.bcel.classfile.ElementValue> map, boolean runtimeVisible) Methods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector
getClassContext, shouldVisitCode, visitClassContextMethods 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, 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, visitCode, 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, visitCodeException, visitConstantClass, visitConstantDouble, visitConstantFieldref, visitConstantFloat, visitConstantInteger, visitConstantInterfaceMethodref, visitConstantLong, visitConstantMethodref, visitConstantNameAndType, visitConstantString, visitConstantUtf8, visitConstantValue, visitDeprecated, visitExceptionTable, visitField, visitInnerClass, visitLineNumber, visitLocalVariable, visitLocalVariableTypeTable, visitMethod, 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
-
ARRAY_PATTERN
-
dependencyGraph
-
bugReporter
private edu.umd.cs.findbugs.BugReporter bugReporter -
className
-
-
Constructor Details
-
FindClassCircularDependencies
public FindClassCircularDependencies(edu.umd.cs.findbugs.BugReporter bugReporter) constructs a FCCD detector given the reporter to report bugs on- Parameters:
bugReporter- the sync of bug reports
-
-
Method Details
-
visit
public void visit(org.apache.bcel.classfile.JavaClass obj) - Overrides:
visitin classedu.umd.cs.findbugs.visitclass.BetterVisitor
-
visitAnnotation
public void visitAnnotation(@DottedClassName String annotationClass, Map<String, org.apache.bcel.classfile.ElementValue> map, boolean runtimeVisible) - Overrides:
visitAnnotationin classedu.umd.cs.findbugs.visitclass.AnnotationVisitor
-
sawOpcode
public void sawOpcode(int seen) - Overrides:
sawOpcodein classedu.umd.cs.findbugs.visitclass.DismantleBytecode
-
processInvoke
private void processInvoke() -
processLoadConstant
private void processLoadConstant() -
normalizeArrayClass
-
getDependenciesForClass
returns a set of dependent class names for a class, and if it doesn't exist create the set install it, and then return;- Parameters:
clsName- the class for which you are trying to get dependencies- Returns:
- the active set of classes that are dependent on the specified class
-
isEnclosingClassName
-
report
public void report()- Specified by:
reportin interfaceedu.umd.cs.findbugs.Detector- Overrides:
reportin classedu.umd.cs.findbugs.BytecodeScanningDetector
-
isStaticChild
-
removeDependencyLeaves
private void removeDependencyLeaves() -
removeLoopLinks
-