Class ClassInspector


  • public class ClassInspector
    extends java.lang.Object
    Methods to find out relationships between classes and methods within a class. All class names within this interface are treated as java language class names, e.g. int, COM.foo.Myclass, int[], java.lang.Object[]. That is java internal class names as defined in the class file format are not understood.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      boolean accessible​(java.lang.String className)
      Does the named class exist, and is it accessible?
      private void addResolvedTypes​(java.util.HashMap<java.lang.reflect.Type,​java.lang.reflect.Type> resolvedTypes, java.lang.reflect.Type genericType)
      Given a generic type, add its parameter types to an evolving map of resolved types.
      boolean assignableTo​(java.lang.String fromClassName, java.lang.String toClassName)
      Is one named class assignable to another named class or interface?
      private java.lang.Class[] boundType​(java.lang.reflect.Type type)
      Get the bounds for a single type variable.
      protected boolean classConvertableFromTo​(java.lang.Class fromClass, java.lang.Class toClass, boolean mixTypes)
      Can we convert a fromClass to toClass.
      java.lang.reflect.Member findPublicConstructor​(java.lang.String receiverType, java.lang.String[] parmTypes, java.lang.String[] primParmTypes, boolean[] isParam)
      Find a public constructor that implements a given signature.
      java.lang.reflect.Member findPublicField​(java.lang.String receiverType, java.lang.String fieldName, boolean staticField)
      Find a public field for a class.
      java.lang.reflect.Member findPublicMethod​(java.lang.String receiverType, java.lang.String methodName, java.lang.String[] parmTypes, java.lang.String[] primParmTypes, boolean[] isParam, boolean staticMethod, boolean repeatLastParameter, boolean hasVarargs)
      Find a public method that implements a given signature.
      private java.lang.Class[][] findTypeBounds​(java.lang.reflect.ParameterizedType pt)
      Get the type bounds for all of the type variables of the given parameterized type.
      java.lang.Class<?> getClass​(java.lang.String className)
      Get (load) the class for the given class name.
      java.lang.String getDeclaringClass​(java.lang.reflect.Member method)
      Get the declaring class for a method.
      java.lang.Class<?>[] getGenericParameterTypes​(java.lang.Class parameterizedType, java.lang.Class implementation)
      Given an implementation of a parameterized interface, return the actual types of the interface type variables.
      private java.util.ArrayList<java.lang.Class<?>> getParameterTypes​(java.lang.Class<?> parameterizedType, java.util.HashMap<java.lang.reflect.Type,​java.lang.reflect.Type> resolvedTypes)
      Given a map of resolved types, compose them together in order to resolve the actual concrete types that are plugged into the parameterized type.
      java.lang.String[] getParameterTypes​(java.lang.reflect.Member method)
      Get the parameter types for a method described by a Member as a String[].
      private java.lang.Class getRawType​(java.lang.reflect.Type bound)
      Get the raw type of a type bound.
      private java.util.HashMap<java.lang.reflect.Type,​java.lang.reflect.Type> getResolvedTypes​(java.util.ArrayList<java.lang.Class<?>> chain)
      Given an inheritance chain of types, stretching from a superclass down to a terminal concrete class, construct a map of generic types to their resolved types.
      java.lang.String getType​(java.lang.reflect.Member member)
      Get the Java name of the return type from a Member representing a method or the type of a Member representing a field.
      java.lang.Class[][] getTypeBounds​(java.lang.Class parameterizedInterface, java.lang.Class implementation)
      Given an implementation of a parameterized interface, return the bounds on the type variables.
      private java.util.ArrayList<java.lang.Class<?>> getTypeChain​(java.lang.Class<?> chainEnd, java.lang.Class<?> start)
      Construct an inheritance chain of types stretching from a supertype down to a concrete implementation.
      boolean instanceOf​(java.lang.String className, java.lang.Object obj)
      Is the given object an instance of the named class?
      boolean isVarArgsMethod​(java.lang.reflect.Member member)
      Return true if the method or constructor supports varargs.
      static boolean primitiveType​(java.lang.String typeName)
      Determine whether a type is a Java primitive, like int or boolean
      static java.lang.String readableClassName​(java.lang.Class clazz)
      Translate a JVM-style type descriptor to a Java-language-style type name.
      private java.lang.reflect.Member resolveMethod​(java.lang.Class receiverClass, java.lang.String methodName, java.lang.Class[] paramClasses, java.lang.Class[] primParamClasses, boolean[] isParam, boolean staticMethod, boolean repeatLastParameter, java.lang.reflect.Member[] methods, boolean hasVarargs)
      Tricky function to resolve a method.
      private boolean signatureConvertableFromTo​(java.lang.Class[] fromTypes, java.lang.Class[] primFromTypes, java.lang.Class[] toTypes, boolean[] isParam, boolean mixTypes)
      Can we convert a signature from fromTypes(primFromTypes) to toTypes.
      • Methods inherited from class java.lang.Object

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

      • primTypeNames

        private static final java.lang.String[] primTypeNames
      • nonPrimTypeNames

        private static final java.lang.String[] nonPrimTypeNames
      • OBJECT_TYPE_NAME

        private static final java.lang.String OBJECT_TYPE_NAME
        See Also:
        Constant Field Values
      • STRING_TYPE_NAME

        private static final java.lang.String STRING_TYPE_NAME
        See Also:
        Constant Field Values
      • BIGDECIMAL_TYPE_NAME

        private static final java.lang.String BIGDECIMAL_TYPE_NAME
        See Also:
        Constant Field Values
    • Constructor Detail

      • ClassInspector

        public ClassInspector​(ClassFactory cf)
        DO NOT USE! use the method in ClassFactory.
    • Method Detail

      • instanceOf

        public boolean instanceOf​(java.lang.String className,
                                  java.lang.Object obj)
                           throws java.lang.ClassNotFoundException
        Is the given object an instance of the named class?
        Parameters:
        className - The name of the class
        obj - The object to test to see if it's an instance of the named class
        Returns:
        true if obj is an instanceof className, false if not
        Throws:
        java.lang.ClassNotFoundException
      • assignableTo

        public boolean assignableTo​(java.lang.String fromClassName,
                                    java.lang.String toClassName)
        Is one named class assignable to another named class or interface?
        Parameters:
        fromClassName - The name of the class to be assigned
        toClassName - The name of the class to be assigned to
        Returns:
        true if an object of type fromClass can be assigned to an object of type toClass, false if not.
      • accessible

        public boolean accessible​(java.lang.String className)
                           throws java.lang.ClassNotFoundException
        Does the named class exist, and is it accessible?
        Parameters:
        className - The name of the class to test for existence
        Returns:
        true if the class exists and is accessible, false if not
        Throws:
        java.lang.ClassNotFoundException
      • getType

        public java.lang.String getType​(java.lang.reflect.Member member)
        Get the Java name of the return type from a Member representing a method or the type of a Member representing a field.
        Parameters:
        member - A Member representing the method for which we want the return type.
        Returns:
        A Java-language-style string describing the return type of the method (for example, it returns "int" instead of "I".
      • findPublicMethod

        public java.lang.reflect.Member findPublicMethod​(java.lang.String receiverType,
                                                         java.lang.String methodName,
                                                         java.lang.String[] parmTypes,
                                                         java.lang.String[] primParmTypes,
                                                         boolean[] isParam,
                                                         boolean staticMethod,
                                                         boolean repeatLastParameter,
                                                         boolean hasVarargs)
                                                  throws java.lang.ClassNotFoundException,
                                                         StandardException
        Find a public method that implements a given signature. The signature is given using the full Java class names of the types.
        A untyped null parameter is indicated by passing in an empty string ("") as its class name.
        If receiverType represents an interface then the methods of java.lang.Object are included in the candidate list.
        If the caller is simply checking to see that a public method with the specified name exists, regardless of the signature, exists, then the caller should pass in a null for parmTypes. (This is useful for checking the validity of a method alias when creating one.)
        We use a two-pass algorithm to resolve methods. In the first pass, we use all "object" types to try to match a method. If this fails, in the second pass, an array of "primitive" types (if the parameter has one, otherwise the same object type is used) is passed in, as well as the "object" type array. For each parameter of a method, we try to match it against either the "object" type, or the "primitive" type. Of all the qualified candidate methods found, we choose the closest one to the input parameter types. This involves comparing methods whose parameters are mixed "object" and "primitive" types in the second pass. This is eventually handled in classConvertableFromTo.
        Parameters:
        receiverType - The class name of the receiver
        methodName - The name of the method
        parmTypes - An array of class names representing the parameter types. Pass a zero-element array if there are no parameters. Pass a null if it is okay to match any signature.
        primParmTypes - This is used in the second pass of the two-pass method resolution algorithm. Use primitive type if it has one, otherwise use same object type
        isParam - Array of booleans telling whether parameter is a ?.
        staticMethod - Find a static method.
        repeatLastParameter - If true the last parameter may be repeated any number of times (total count must be greater than one). If false the last parameter is matched as usual. This also requires an exact match on the last parameter type.
        Returns:
        A Member representing the matching method. Returns null if no such method.
        Throws:
        java.lang.ClassNotFoundException - One or more of the classes does not exist.
        StandardException - Thrown on ambiguous method invocation.
        See Also:
        Member, Modifier
      • findPublicField

        public java.lang.reflect.Member findPublicField​(java.lang.String receiverType,
                                                        java.lang.String fieldName,
                                                        boolean staticField)
                                                 throws StandardException
        Find a public field for a class. This follows the semantics of the java compiler for locating a field. This means if a field fieldName exists in the class with package, private or protected then an error is raised. Even if the field hides a field fieldName in a super-class/super--interface. See the JVM spec on fields.
        Parameters:
        receiverType - The class name of the receiver
        fieldName - The name of the field
        staticField - Find a static field
        Returns:
        A Member representing the matching field.
        Throws:
        StandardException - Class or field does not exist or is not public or a security exception.
        See Also:
        Member, Modifier
      • findPublicConstructor

        public java.lang.reflect.Member findPublicConstructor​(java.lang.String receiverType,
                                                              java.lang.String[] parmTypes,
                                                              java.lang.String[] primParmTypes,
                                                              boolean[] isParam)
                                                       throws java.lang.ClassNotFoundException,
                                                              StandardException
        Find a public constructor that implements a given signature. The signature is given using the full Java class names of the types.
        A untyped null parameter is indicated by passing in an empty string ("") as its class name.
        Parameters:
        receiverType - The class name of the receiver
        parmTypes - An array of class names representing the parameter types. Pass a zero-element array if there are no parameters.
        primParmTypes - This is used in the second pass of the two-pass method resolution algorithm. Use primitive type if it has one, otherwise use same object type
        isParam - Array of booleans telling whether parameter is a ?.
        Returns:
        A Member representing the matching constructor. Returns null if no such constructor.
        Throws:
        java.lang.ClassNotFoundException - One or more of the classes does not exist.
        StandardException - Thrown on ambiguous constructor invocation.
        See Also:
        Member, Modifier
      • getTypeBounds

        public java.lang.Class[][] getTypeBounds​(java.lang.Class parameterizedInterface,
                                                 java.lang.Class implementation)
                                          throws StandardException
        Given an implementation of a parameterized interface, return the bounds on the type variables. May return null if type resolution fails.
        Throws:
        StandardException
      • isVarArgsMethod

        public boolean isVarArgsMethod​(java.lang.reflect.Member member)
        Return true if the method or constructor supports varargs.
      • getGenericParameterTypes

        public java.lang.Class<?>[] getGenericParameterTypes​(java.lang.Class parameterizedType,
                                                             java.lang.Class implementation)
                                                      throws StandardException
        Given an implementation of a parameterized interface, return the actual types of the interface type variables. May return null or an array of nulls if type resolution fails.
        Throws:
        StandardException
      • getParameterTypes

        public java.lang.String[] getParameterTypes​(java.lang.reflect.Member method)
        Get the parameter types for a method described by a Member as a String[].
        Parameters:
        method - A Member describing a method
        Returns:
        A String[] describing the parameters of the method
      • primitiveType

        public static boolean primitiveType​(java.lang.String typeName)
        Determine whether a type is a Java primitive, like int or boolean
        Parameters:
        typeName - The name of the Java type
        Returns:
        true if it's a primitive type
      • resolveMethod

        private java.lang.reflect.Member resolveMethod​(java.lang.Class receiverClass,
                                                       java.lang.String methodName,
                                                       java.lang.Class[] paramClasses,
                                                       java.lang.Class[] primParamClasses,
                                                       boolean[] isParam,
                                                       boolean staticMethod,
                                                       boolean repeatLastParameter,
                                                       java.lang.reflect.Member[] methods,
                                                       boolean hasVarargs)
                                                throws StandardException
        Tricky function to resolve a method. If primParamClasses is null we know it's first pass. First pass try to match as all "object" types, second pass try to match any combination of "object" and "primitive" types. Find the closest match among all the qualified candidates. If there's a tie, it's ambiguous. The preceding paragraph is a bit misleading. As of release 10.4, the second pass did not consider arbitrary combinations of primitive and wrapper types. This is because the first pass removed from consideration candidates which would be allowed under ANSI rules. As a fix for bug DERBY-3652, we now allow primitive and wrapper type matches during the first pass. The ANSI rules are documented in DERBY-3652.
        Parameters:
        receiverClass - the class who holds the methods
        methodName - the name of method
        paramClasses - object type classes of input parameters
        primParamClasses - primitive type classes or null
        isParam - isParam (for ?) array
        staticMethod - static method or not
        methods - method stack
        Returns:
        the matched method
        Throws:
        StandardException
      • getClass

        public java.lang.Class<?> getClass​(java.lang.String className)
                                    throws java.lang.ClassNotFoundException
        Get (load) the class for the given class name. This method converts any java language class name into a Class object. This includes cases like String[] and primitive types. This will attempt to load the class from the application set.
        Throws:
        java.lang.ClassNotFoundException - Class cannot be found, or a SecurityException or LinkageException was thrown loading the class.
      • signatureConvertableFromTo

        private boolean signatureConvertableFromTo​(java.lang.Class[] fromTypes,
                                                   java.lang.Class[] primFromTypes,
                                                   java.lang.Class[] toTypes,
                                                   boolean[] isParam,
                                                   boolean mixTypes)
        Can we convert a signature from fromTypes(primFromTypes) to toTypes. "mixTypes" is a flag to show if object/primitive type conversion is possible; this is used for comparing two candidate methods in the second pass of the two pass method resolution.
        Parameters:
        fromTypes - from types' classes
        primFromTypes - primitive from types or null
        toTypes - to types' classes
        isParam - is parameter (?) or not
        mixTypes - mixing object/primitive types for comparison
      • classConvertableFromTo

        protected boolean classConvertableFromTo​(java.lang.Class fromClass,
                                                 java.lang.Class toClass,
                                                 boolean mixTypes)
        Can we convert a fromClass to toClass. "mixTypes" is a flag to show if object/primitive type conversion is possible; this is used for comparing two candidate methods in the second pass of the two pass method resolution.
        Parameters:
        fromClass - from class
        toClass - to class
        mixTypes - mixing object/primitive types for comparison
      • readableClassName

        public static java.lang.String readableClassName​(java.lang.Class clazz)
        Translate a JVM-style type descriptor to a Java-language-style type name.
        Parameters:
        clazz - The String that contains the JVM type name
        Returns:
        The Java-language-style type name
      • getDeclaringClass

        public java.lang.String getDeclaringClass​(java.lang.reflect.Member method)
        Get the declaring class for a method.
        Parameters:
        method - A Member describing a method
        Returns:
        A String with the declaring class
        See Also:
        Member.getDeclaringClass()
      • findTypeBounds

        private java.lang.Class[][] findTypeBounds​(java.lang.reflect.ParameterizedType pt)
        Get the type bounds for all of the type variables of the given parameterized type.
      • boundType

        private java.lang.Class[] boundType​(java.lang.reflect.Type type)
        Get the bounds for a single type variable.
      • getRawType

        private java.lang.Class getRawType​(java.lang.reflect.Type bound)
        Get the raw type of a type bound.
      • getTypeChain

        private java.util.ArrayList<java.lang.Class<?>> getTypeChain​(java.lang.Class<?> chainEnd,
                                                                     java.lang.Class<?> start)
        Construct an inheritance chain of types stretching from a supertype down to a concrete implementation.
      • getResolvedTypes

        private java.util.HashMap<java.lang.reflect.Type,​java.lang.reflect.Type> getResolvedTypes​(java.util.ArrayList<java.lang.Class<?>> chain)
        Given an inheritance chain of types, stretching from a superclass down to a terminal concrete class, construct a map of generic types to their resolved types.
      • addResolvedTypes

        private void addResolvedTypes​(java.util.HashMap<java.lang.reflect.Type,​java.lang.reflect.Type> resolvedTypes,
                                      java.lang.reflect.Type genericType)
        Given a generic type, add its parameter types to an evolving map of resolved types. Some of the resolved types may be generic type variables which will need further resolution from other generic types.
      • getParameterTypes

        private java.util.ArrayList<java.lang.Class<?>> getParameterTypes​(java.lang.Class<?> parameterizedType,
                                                                          java.util.HashMap<java.lang.reflect.Type,​java.lang.reflect.Type> resolvedTypes)
        Given a map of resolved types, compose them together in order to resolve the actual concrete types that are plugged into the parameterized type.