Class OverlyConcreteParameter

  • All Implemented Interfaces:
    edu.umd.cs.findbugs.Detector, edu.umd.cs.findbugs.Priorities, edu.umd.cs.findbugs.visitclass.Constants2, org.apache.bcel.classfile.Visitor, org.apache.bcel.Constants

    public class OverlyConcreteParameter
    extends edu.umd.cs.findbugs.BytecodeScanningDetector
    looks for parameters that are defined by classes, but only use methods defined by an implemented interface or super class. Relying on concrete classes in public signatures causes cohesion, and makes low impact changes more difficult.
    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class Description
      (package private) static class  OverlyConcreteParameter.MethodInfo
      an inner helper class that holds basic information about a method
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private edu.umd.cs.findbugs.BugReporter bugReporter  
      private org.apache.bcel.classfile.JavaClass cls  
      private org.apache.bcel.classfile.JavaClass[] constrainingClasses  
      private static java.util.Set<java.lang.String> CONVERSION_ANNOTATIONS  
      private static java.util.Set<java.lang.String> CONVERSION_SUPER_CLASSES  
      private boolean methodIsStatic  
      private boolean methodSignatureIsConstrained  
      private org.apache.bcel.classfile.JavaClass objectClass  
      private static java.util.Set<java.lang.String> OVERLY_CONCRETE_INTERFACES  
      private java.util.Map<java.lang.Integer,​java.util.Map<org.apache.bcel.classfile.JavaClass,​java.util.List<OverlyConcreteParameter.MethodInfo>>> parameterDefiners  
      private int parmCount  
      private edu.umd.cs.findbugs.OpcodeStack stack  
      private edu.umd.cs.findbugs.OpcodeStack.Item ternary1Value  
      private edu.umd.cs.findbugs.OpcodeStack.Item ternary2Value  
      private int ternaryTarget  
      private java.util.BitSet usedParameters  
      • Fields inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode

        codeBytes, lineNumberTable, M_BR, M_CP, M_INT, M_PAD, M_R, M_UINT
      • Fields inherited from interface org.apache.bcel.Constants

        AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_SYPER, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE, ACCESS_NAMES, ACONST_NULL, ALOAD, ALOAD_0, ALOAD_1, ALOAD_2, ALOAD_3, ANEWARRAY, ANEWARRAY_QUICK, APPEND_FRAME, APPEND_FRAME_MAX, ARETURN, ARRAYLENGTH, ASTORE, ASTORE_0, ASTORE_1, ASTORE_2, ASTORE_3, ATHROW, ATTR_ANNOTATION_DEFAULT, ATTR_CODE, ATTR_CONSTANT_VALUE, ATTR_DEPRECATED, ATTR_ENCLOSING_METHOD, ATTR_EXCEPTIONS, ATTR_INNER_CLASSES, ATTR_LINE_NUMBER_TABLE, ATTR_LOCAL_VARIABLE_TABLE, ATTR_LOCAL_VARIABLE_TYPE_TABLE, ATTR_PMG, ATTR_RUNTIME_VISIBLE_ANNOTATIONS, ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, ATTR_RUNTIMEIN_VISIBLE_ANNOTATIONS, ATTR_RUNTIMEIN_VISIBLE_PARAMETER_ANNOTATIONS, ATTR_SIGNATURE, ATTR_SOURCE_FILE, ATTR_STACK_MAP, ATTR_STACK_MAP_TABLE, ATTR_SYNTHETIC, ATTR_UNKNOWN, ATTRIBUTE_NAMES, BALOAD, BASTORE, BIPUSH, BREAKPOINT, CALOAD, CASTORE, CHECKCAST, CHECKCAST_QUICK, CHOP_FRAME, CHOP_FRAME_MAX, CLASS_TYPE_NAMES, CONSTANT_Class, CONSTANT_Double, CONSTANT_Fieldref, CONSTANT_Float, CONSTANT_Integer, CONSTANT_InterfaceMethodref, CONSTANT_InvokeDynamic, CONSTANT_Long, CONSTANT_MethodHandle, CONSTANT_Methodref, CONSTANT_MethodType, CONSTANT_NameAndType, CONSTANT_NAMES, CONSTANT_String, CONSTANT_Utf8, CONSTRUCTOR_NAME, CONSUME_STACK, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DLOAD_0, DLOAD_1, DLOAD_2, DLOAD_3, DMUL, DNEG, DREM, DRETURN, DSTORE, DSTORE_0, DSTORE_1, DSTORE_2, DSTORE_3, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAD_0, FLOAD_1, FLOAD_2, FLOAD_3, FMUL, FNEG, FREM, FRETURN, FSTORE, FSTORE_0, FSTORE_1, FSTORE_2, FSTORE_3, FSUB, FULL_FRAME, GETFIELD, GETFIELD_QUICK, GETFIELD_QUICK_W, GETFIELD2_QUICK, GETSTATIC, GETSTATIC_QUICK, GETSTATIC2_QUICK, GOTO, GOTO_W, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILLEGAL_OPCODE, ILLEGAL_TYPE, ILOAD, ILOAD_0, ILOAD_1, ILOAD_2, ILOAD_3, IMPDEP1, IMPDEP2, IMUL, INEG, INSTANCEOF, INSTANCEOF_QUICK, INT2BYTE, INT2CHAR, INT2SHORT, INTERFACES_IMPLEMENTED_BY_ARRAYS, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKEINTERFACE_QUICK, INVOKENONVIRTUAL, INVOKENONVIRTUAL_QUICK, INVOKESPECIAL, INVOKESTATIC, INVOKESTATIC_QUICK, INVOKESUPER_QUICK, INVOKEVIRTUAL, INVOKEVIRTUAL_QUICK, INVOKEVIRTUAL_QUICK_W, INVOKEVIRTUALOBJECT_QUICK, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISTORE_0, ISTORE_1, ISTORE_2, ISTORE_3, ISUB, ITEM_Bogus, ITEM_Double, ITEM_Float, ITEM_InitObject, ITEM_Integer, ITEM_Long, ITEM_NAMES, ITEM_NewObject, ITEM_Null, ITEM_Object, IUSHR, IXOR, JSR, JSR_W, KNOWN_ATTRIBUTES, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDC_QUICK, LDC_W, LDC_W_QUICK, LDC2_W, LDC2_W_QUICK, LDIV, LLOAD, LLOAD_0, LLOAD_1, LLOAD_2, LLOAD_3, LMUL, LNEG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSTORE_0, LSTORE_1, LSTORE_2, LSTORE_3, LSUB, LUSHR, LXOR, MAJOR, MAJOR_1_1, MAJOR_1_2, MAJOR_1_3, MAJOR_1_4, MAJOR_1_5, MAJOR_1_6, MAJOR_1_7, MAJOR_1_8, MAX_ACC_FLAG, MAX_BYTE, MAX_CODE_SIZE, MAX_CP_ENTRIES, MAX_SHORT, MINOR, MINOR_1_1, MINOR_1_2, MINOR_1_3, MINOR_1_4, MINOR_1_5, MINOR_1_6, MINOR_1_7, MINOR_1_8, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, MULTIANEWARRAY_QUICK, NEW, NEW_QUICK, NEWARRAY, NO_OF_OPERANDS, NOP, OPCODE_NAMES, POP, POP2, PRODUCE_STACK, PUSH, PUTFIELD, PUTFIELD_QUICK, PUTFIELD_QUICK_W, PUTFIELD2_QUICK, PUTSTATIC, PUTSTATIC_QUICK, PUTSTATIC2_QUICK, RESERVED, RET, RETURN, SALOAD, SAME_FRAME, SAME_FRAME_EXTENDED, SAME_FRAME_MAX, SAME_LOCALS_1_STACK_ITEM_FRAME, SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED, SAME_LOCALS_1_STACK_ITEM_FRAME_MAX, SASTORE, SHORT_TYPE_NAMES, SIPUSH, STATIC_INITIALIZER_NAME, SWAP, SWITCH, T_ADDRESS, T_ARRAY, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_OBJECT, T_REFERENCE, T_SHORT, T_UNKNOWN, T_VOID, TABLESWITCH, TYPE_NAMES, TYPE_OF_OPERANDS, UNDEFINED, UNPREDICTABLE, WIDE
      • Fields inherited from interface edu.umd.cs.findbugs.Priorities

        EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY
    • Constructor Summary

      Constructors 
      Constructor Description
      OverlyConcreteParameter​(edu.umd.cs.findbugs.BugReporter bugReporter)
      constructs a OCP detector given the reporter to report bugs on
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      private boolean buildParameterDefiners()
      builds a map of method information for each method of each interface that each parameter implements of this method
      private static java.lang.String getCardinality​(int num)
      returns a string defining what parameter in the signature a certain one is, for the bug report
      private static java.util.Map<org.apache.bcel.classfile.JavaClass,​java.util.List<OverlyConcreteParameter.MethodInfo>> getClassDefiners​(org.apache.bcel.classfile.JavaClass cls)
      returns a map of method information for each public method for each interface this class implements
      private static java.util.List<OverlyConcreteParameter.MethodInfo> getPublicMethodInfos​(org.apache.bcel.classfile.JavaClass cls)
      returns a list of method information of all public or protected methods in this class
      private boolean hasOverloadedMethod()
      looks to see if this method has an overloaded method in actuality, this isn't precise and returns true for methods that are named the same, and have same number of args This will miss some cases, but in practicality doesn't matter.
      private boolean isaConversionClass​(org.apache.bcel.classfile.JavaClass conversionCls)
      returns whether this class is used to convert types of some sort, such that you don't want to suggest reducing the class specified to be more generic
      private boolean isExceptionHandled​(java.lang.String ex)
      returns whether this exception is handled either in a try/catch or throws clause at this pc
      private boolean methodHasSyntheticTwin​(java.lang.String methodName, java.lang.String methodSig)
      returns whether this method has an equivalent method that is synthetic, which implies this method is constrained by some Generified interface.
      private static boolean methodIsSpecial​(java.lang.String methodName, java.lang.String methodSig)
      determines whether the method is a baked in special method of the jdk
      private void removeInheritedInterfaces​(java.util.Map<org.apache.bcel.classfile.JavaClass,​java.util.List<OverlyConcreteParameter.MethodInfo>> definers)  
      private void removeParmDefiner​(edu.umd.cs.findbugs.OpcodeStack.Item itm)
      removes a parameter from the definer list, if the item is in fact a parameter
      private void removeUselessDefiners​(int reg)
      parses through the interface that 'may' define a parameter defined by reg, and look to see if we can rule it out, because a method is called on the object that can't be satisfied by the interface, if so remove that candidate interface.
      private void removeUselessDefiners​(java.lang.String parmSig, int reg)  
      private void reportBugs()
      implements the post processing steps to report the remaining unremoved parameter definers, ie those, that can be defined more abstractly.
      void sawOpcode​(int seen)
      implements the visitor to filter out parameter use where the actual defined type of the method declaration is needed.
      void visitClassContext​(edu.umd.cs.findbugs.ba.ClassContext classContext)
      implements the visitor to collect classes that constrains this class (super classes/interfaces) and to reset the opcode stack
      void visitCode​(org.apache.bcel.classfile.Code obj)
      implements the visitor to collect information about the parameters of a this method
      void visitMethod​(org.apache.bcel.classfile.Method obj)
      implements the visitor to look to see if this method is constrained by a superclass or interface.
      • Methods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector

        getClassContext, report, shouldVisitCode
      • Methods 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, visit
      • Methods inherited from class edu.umd.cs.findbugs.visitclass.AnnotationVisitor

        getAnnotationParameterAsString, getAnnotationParameterAsStringArray, visitAnnotation, visitAnnotation, visitParameterAnnotation, visitParameterAnnotation, visitSyntheticParameterAnnotation
      • Methods 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, getSurroundingTryBlock, getSurroundingTryBlock, getThisClass, getXClass, getXField, getXMethod, hasInterestingClass, hasInterestingMethod, isVisitMethodsInCallOrder, setupVisitorForClass, setVisitMethodsInCallOrder, shouldVisit, toString, visitAfter, visitAfter, visitAnnotationDefault, visitAnnotationEntry, visitConstantPool, visitEnclosingMethod, visitingField, visitingMethod, visitInnerClasses, visitJavaClass, visitLineNumberTable, visitLocalVariableTable, visitStackMapTable, visitStackMapTableEntry
      • Methods 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, visitStackMap, visitStackMapEntry, visitSynthetic, visitUnknown
      • Methods inherited from class java.lang.Object

        equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
    • Field Detail

      • CONVERSION_ANNOTATIONS

        private static final java.util.Set<java.lang.String> CONVERSION_ANNOTATIONS
      • CONVERSION_SUPER_CLASSES

        private static final java.util.Set<java.lang.String> CONVERSION_SUPER_CLASSES
      • OVERLY_CONCRETE_INTERFACES

        private static final java.util.Set<java.lang.String> OVERLY_CONCRETE_INTERFACES
      • bugReporter

        private final edu.umd.cs.findbugs.BugReporter bugReporter
      • constrainingClasses

        private org.apache.bcel.classfile.JavaClass[] constrainingClasses
      • parameterDefiners

        private java.util.Map<java.lang.Integer,​java.util.Map<org.apache.bcel.classfile.JavaClass,​java.util.List<OverlyConcreteParameter.MethodInfo>>> parameterDefiners
      • usedParameters

        private java.util.BitSet usedParameters
      • objectClass

        private org.apache.bcel.classfile.JavaClass objectClass
      • cls

        private org.apache.bcel.classfile.JavaClass cls
      • stack

        private edu.umd.cs.findbugs.OpcodeStack stack
      • parmCount

        private int parmCount
      • methodSignatureIsConstrained

        private boolean methodSignatureIsConstrained
      • methodIsStatic

        private boolean methodIsStatic
      • ternary1Value

        private edu.umd.cs.findbugs.OpcodeStack.Item ternary1Value
      • ternary2Value

        private edu.umd.cs.findbugs.OpcodeStack.Item ternary2Value
      • ternaryTarget

        private int ternaryTarget
    • Constructor Detail

      • OverlyConcreteParameter

        public OverlyConcreteParameter​(edu.umd.cs.findbugs.BugReporter bugReporter)
        constructs a OCP detector given the reporter to report bugs on
        Parameters:
        bugReporter - the sync of bug reports
    • Method Detail

      • visitClassContext

        public void visitClassContext​(edu.umd.cs.findbugs.ba.ClassContext classContext)
        implements the visitor to collect classes that constrains this class (super classes/interfaces) and to reset the opcode stack
        Specified by:
        visitClassContext in interface edu.umd.cs.findbugs.Detector
        Overrides:
        visitClassContext in class edu.umd.cs.findbugs.BytecodeScanningDetector
        Parameters:
        classContext - the currently parse class
      • visitMethod

        public void visitMethod​(org.apache.bcel.classfile.Method obj)
        implements the visitor to look to see if this method is constrained by a superclass or interface.
        Specified by:
        visitMethod in interface org.apache.bcel.classfile.Visitor
        Overrides:
        visitMethod in class edu.umd.cs.findbugs.visitclass.BetterVisitor
        Parameters:
        obj - the currently parsed method
      • visitCode

        public void visitCode​(org.apache.bcel.classfile.Code obj)
        implements the visitor to collect information about the parameters of a this method
        Specified by:
        visitCode in interface org.apache.bcel.classfile.Visitor
        Overrides:
        visitCode in class edu.umd.cs.findbugs.visitclass.PreorderVisitor
        Parameters:
        obj - the currently parsed code block
      • sawOpcode

        public void sawOpcode​(int seen)
        implements the visitor to filter out parameter use where the actual defined type of the method declaration is needed. What remains could be more abstractly defined.
        Overrides:
        sawOpcode in class edu.umd.cs.findbugs.visitclass.DismantleBytecode
        Parameters:
        seen - the currently parsed opcode
      • removeParmDefiner

        private void removeParmDefiner​(edu.umd.cs.findbugs.OpcodeStack.Item itm)
        removes a parameter from the definer list, if the item is in fact a parameter
        Parameters:
        itm - the possible parameter
      • methodIsSpecial

        private static boolean methodIsSpecial​(java.lang.String methodName,
                                               java.lang.String methodSig)
        determines whether the method is a baked in special method of the jdk
        Parameters:
        methodName - the method name to check
        methodSig - the parameter signature of the method to check
        Returns:
        if it is a well known baked in method
      • methodHasSyntheticTwin

        private boolean methodHasSyntheticTwin​(java.lang.String methodName,
                                               java.lang.String methodSig)
        returns whether this method has an equivalent method that is synthetic, which implies this method is constrained by some Generified interface. We could compare parameters but that is a bunch of work that probably doesn't make this test any more precise, so just return true if method name and synthetic is found.
        Parameters:
        methodName - the method name to look for a synthetic twin of
        methodSig - the method signature to lookfor a synthetic twin of
        Returns:
        if a synthetic twin is found
      • reportBugs

        private void reportBugs()
        implements the post processing steps to report the remaining unremoved parameter definers, ie those, that can be defined more abstractly.
      • hasOverloadedMethod

        private boolean hasOverloadedMethod()
        looks to see if this method has an overloaded method in actuality, this isn't precise and returns true for methods that are named the same, and have same number of args This will miss some cases, but in practicality doesn't matter.
        Returns:
        whether there is a method in this class that overrides the given method
      • removeInheritedInterfaces

        private void removeInheritedInterfaces​(java.util.Map<org.apache.bcel.classfile.JavaClass,​java.util.List<OverlyConcreteParameter.MethodInfo>> definers)
                                        throws java.lang.ClassNotFoundException
        Throws:
        java.lang.ClassNotFoundException
      • getCardinality

        private static java.lang.String getCardinality​(int num)
        returns a string defining what parameter in the signature a certain one is, for the bug report
        Parameters:
        num - the parameter number
        Returns:
        a string describing in english the parameter position
      • buildParameterDefiners

        private boolean buildParameterDefiners()
                                        throws java.lang.ClassNotFoundException
        builds a map of method information for each method of each interface that each parameter implements of this method
        Returns:
        a map by parameter id of all the method signatures that interfaces of that parameter implements
        Throws:
        java.lang.ClassNotFoundException - if the class can't be loaded
      • getClassDefiners

        private static java.util.Map<org.apache.bcel.classfile.JavaClass,​java.util.List<OverlyConcreteParameter.MethodInfo>> getClassDefiners​(org.apache.bcel.classfile.JavaClass cls)
                                                                                                                                             throws java.lang.ClassNotFoundException
        returns a map of method information for each public method for each interface this class implements
        Parameters:
        cls - the class whose interfaces to record
        Returns:
        a map of (method name)(method sig) by interface
        Throws:
        java.lang.ClassNotFoundException - if unable to load the class
      • getPublicMethodInfos

        private static java.util.List<OverlyConcreteParameter.MethodInfo> getPublicMethodInfos​(org.apache.bcel.classfile.JavaClass cls)
        returns a list of method information of all public or protected methods in this class
        Parameters:
        cls - the class to look for methods
        Returns:
        a map of (method name)(method signature)
      • removeUselessDefiners

        private void removeUselessDefiners​(int reg)
        parses through the interface that 'may' define a parameter defined by reg, and look to see if we can rule it out, because a method is called on the object that can't be satisfied by the interface, if so remove that candidate interface.
        Parameters:
        reg - the parameter register number to look at
      • isExceptionHandled

        private boolean isExceptionHandled​(java.lang.String ex)
        returns whether this exception is handled either in a try/catch or throws clause at this pc
        Parameters:
        ex - the name of the exception
        Returns:
        whether the exception is handled
      • removeUselessDefiners

        private void removeUselessDefiners​(java.lang.String parmSig,
                                           int reg)
      • isaConversionClass

        private boolean isaConversionClass​(org.apache.bcel.classfile.JavaClass conversionCls)
        returns whether this class is used to convert types of some sort, such that you don't want to suggest reducing the class specified to be more generic
        Parameters:
        conversionCls - the class to check
        Returns:
        whether this class is used in conversions