Class ClassResolver


  • public class ClassResolver
    extends java.lang.Object
    Utility class to resolve a class name to an actual class. Note that loaded classes are not initialized.

    Limitations: this does not handle inner classes very well.

    • Field Summary

      Fields 
      Modifier and Type Field Description
      private static java.lang.String DOLLAR_SIGN
      Dollar sign literal.
      private java.util.Set<java.lang.String> imports
      Set of imports to check against.
      private java.lang.ClassLoader loader
      Use to load classes.
      private static java.lang.String PERIOD
      Period literal.
      private java.lang.String pkg
      Name of the package to check if the class belongs to.
    • Constructor Summary

      Constructors 
      Constructor Description
      ClassResolver​(java.lang.ClassLoader loader, java.lang.String pkg, java.util.Set<java.lang.String> imports)
      Creates a new ClassResolver instance.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      boolean isLoadable​(java.lang.String name)
      Checks if the given class name can be loaded.
      java.lang.Class<?> resolve​(java.lang.String name, java.lang.String currentClass)
      Attempts to resolve the Class for a specified name.
      private java.lang.Class<?> resolveByStarImports​(java.lang.String name)
      Try star imports.
      private java.lang.Class<?> resolveInnerClass​(java.lang.String name, java.lang.String currentClass)
      See if inner class of this class.
      private java.lang.Class<?> resolveInPackage​(java.lang.String name)
      Try to find class by search in package.
      private java.lang.Class<?> resolveMatchingExplicitImport​(java.lang.String name)
      Try to find class by matching explicit Import.
      private java.lang.Class<?> resolveQualifiedName​(java.lang.String name)
      Tries to resolve a class for fully-specified name.
      private java.lang.Class<?> safeLoad​(java.lang.String name)
      Will load a specified class is such a way that it will NOT be initialised.
      • Methods inherited from class java.lang.Object

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

      • DOLLAR_SIGN

        private static final java.lang.String DOLLAR_SIGN
        Dollar sign literal.
        See Also:
        Constant Field Values
      • pkg

        private final java.lang.String pkg
        Name of the package to check if the class belongs to.
      • imports

        private final java.util.Set<java.lang.String> imports
        Set of imports to check against.
      • loader

        private final java.lang.ClassLoader loader
        Use to load classes.
    • Constructor Detail

      • ClassResolver

        public ClassResolver​(java.lang.ClassLoader loader,
                             java.lang.String pkg,
                             java.util.Set<java.lang.String> imports)
        Creates a new ClassResolver instance.
        Parameters:
        loader - the ClassLoader to load classes with.
        pkg - the name of the package the class may belong to
        imports - set of imports to check if the class belongs to
    • Method Detail

      • resolve

        public java.lang.Class<?> resolve​(java.lang.String name,
                                          java.lang.String currentClass)
                                   throws java.lang.ClassNotFoundException
        Attempts to resolve the Class for a specified name. The algorithm is to check: - fully qualified name - explicit imports - enclosing package - star imports
        Parameters:
        name - name of the class to resolve
        currentClass - name of current class (for inner classes).
        Returns:
        the resolved class
        Throws:
        java.lang.ClassNotFoundException - if unable to resolve the class
      • resolveInPackage

        private java.lang.Class<?> resolveInPackage​(java.lang.String name)
        Try to find class by search in package.
        Parameters:
        name - class name
        Returns:
        class object
      • resolveMatchingExplicitImport

        private java.lang.Class<?> resolveMatchingExplicitImport​(java.lang.String name)
        Try to find class by matching explicit Import.
        Parameters:
        name - class name
        Returns:
        class object
      • resolveInnerClass

        private java.lang.Class<?> resolveInnerClass​(java.lang.String name,
                                                     java.lang.String currentClass)
                                              throws java.lang.ClassNotFoundException
        See if inner class of this class.
        Parameters:
        name - name of the search Class to search
        currentClass - class where search in
        Returns:
        class if found , or null if not resolved
        Throws:
        java.lang.ClassNotFoundException - if an error occurs
      • resolveByStarImports

        private java.lang.Class<?> resolveByStarImports​(java.lang.String name)
        Try star imports.
        Parameters:
        name - name of the Class to search
        Returns:
        class if found , or null if not resolved
      • isLoadable

        public boolean isLoadable​(java.lang.String name)
        Checks if the given class name can be loaded.
        Parameters:
        name - name of the class to check
        Returns:
        whether a specified class is loadable with safeLoad().
      • safeLoad

        private java.lang.Class<?> safeLoad​(java.lang.String name)
                                     throws java.lang.ClassNotFoundException,
                                            java.lang.NoClassDefFoundError
        Will load a specified class is such a way that it will NOT be initialised.
        Parameters:
        name - name of the class to load
        Returns:
        the Class for the specified class
        Throws:
        java.lang.ClassNotFoundException - if an error occurs
        java.lang.NoClassDefFoundError - if an error occurs
      • resolveQualifiedName

        private java.lang.Class<?> resolveQualifiedName​(java.lang.String name)
        Tries to resolve a class for fully-specified name.
        Parameters:
        name - a given name of class.
        Returns:
        Class object for the given name or null.