Class LoaderUtil


  • @InternalApi
    public final class LoaderUtil
    extends java.lang.Object
    Consider this class private. Utility class for ClassLoaders.
    Since:
    2.0.1
    See Also:
    ClassLoader, RuntimePermission, Thread.getContextClassLoader(), ClassLoader.getSystemClassLoader()
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
      private LoaderUtil()  
    • Method Summary

      All Methods Static Methods Concrete Methods 
      Modifier and Type Method Description
      static java.util.Collection<java.net.URL> findResources​(java.lang.String resource)
      Finds classpath resources.
      (package private) static java.util.Collection<java.net.URL> findResources​(java.lang.String resource, boolean useTccl)  
      (package private) static java.util.Collection<LoaderUtil.UrlResource> findUrlResources​(java.lang.String resource, boolean useTccl)  
      static java.lang.ClassLoader getClassLoader()
      Returns the ClassLoader to use.
      static java.lang.ClassLoader getClassLoader​(java.lang.Class<?> class1, java.lang.Class<?> class2)  
      private static java.lang.ClassLoader getThisClassLoader()  
      static java.lang.ClassLoader getThreadContextClassLoader()
      Looks up the ClassLoader for this current thread.
      private static boolean isChild​(java.lang.ClassLoader loader1, java.lang.ClassLoader loader2)
      Determines if one ClassLoader is a child of another ClassLoader.
      static boolean isClassAvailable​(java.lang.String className)
      Determines if a named Class can be loaded or not.
      private static boolean isIgnoreTccl()  
      static java.lang.Class<?> loadClass​(java.lang.String className)
      Loads a class by name.
      static java.lang.Class<?> loadClassUnchecked​(java.lang.String className)
      Loads and initializes a class given its fully qualified class name.
      static <T> T newCheckedInstanceOf​(java.lang.String className, java.lang.Class<T> clazz)
      Loads and instantiates a derived class using its default constructor.
      static <T> T newCheckedInstanceOfProperty​(java.lang.String propertyName, java.lang.Class<T> clazz)
      Loads and instantiates a class given by a property name.
      static <T> T newCheckedInstanceOfProperty​(java.lang.String propertyName, java.lang.Class<T> clazz, java.util.function.Supplier<T> defaultSupplier)
      Loads and instantiates a class given by a property name.
      static <T> T newInstanceOf​(java.lang.Class<T> clazz)
      Loads and instantiates a Class using the default constructor.
      static <T> T newInstanceOf​(java.lang.String className)
      Loads and instantiates a Class using the default constructor.
      static <T> T newInstanceOfUnchecked​(java.lang.Class<T> clazz)
      Creates an instance of the provided class using the default constructor.
      static <T> T newInstanceOfUnchecked​(java.lang.String className)
      Loads and instantiates a class by name using its default constructor.
      static <T> T newInstanceOfUnchecked​(java.lang.String className, java.lang.Class<T> supertype)
      Loads the provided class by name as a checked subtype of the given class.
      private static <T> T runPrivileged​(java.security.PrivilegedAction<T> action)  
      • Methods inherited from class java.lang.Object

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

      • LOGGER

        private static final Logger LOGGER
      • IGNORE_TCCL_PROPERTY

        public static final java.lang.String IGNORE_TCCL_PROPERTY
        System property to set to ignore the thread context ClassLoader.
        Since:
        2.1
        See Also:
        Constant Field Values
      • ignoreTCCL

        private static java.lang.Boolean ignoreTCCL
      • GET_CLASS_LOADER

        static final java.lang.RuntimePermission GET_CLASS_LOADER
      • GET_CLASS_LOADER_DISABLED

        static final LazyBoolean GET_CLASS_LOADER_DISABLED
      • TCCL_GETTER

        private static final java.security.PrivilegedAction<java.lang.ClassLoader> TCCL_GETTER
    • Constructor Detail

      • LoaderUtil

        private LoaderUtil()
    • Method Detail

      • getClassLoader

        public static java.lang.ClassLoader getClassLoader()
        Returns the ClassLoader to use.
        Returns:
        the ClassLoader.
        Since:
        2.22.0
      • getClassLoader

        public static java.lang.ClassLoader getClassLoader​(java.lang.Class<?> class1,
                                                           java.lang.Class<?> class2)
        Since:
        2.22.0
      • isChild

        private static boolean isChild​(java.lang.ClassLoader loader1,
                                       java.lang.ClassLoader loader2)
        Determines if one ClassLoader is a child of another ClassLoader. Note that a null ClassLoader is interpreted as the system ClassLoader as per convention.
        Parameters:
        loader1 - the ClassLoader to check for childhood.
        loader2 - the ClassLoader to check for parenthood.
        Returns:
        true if the first ClassLoader is a strict descendant of the second ClassLoader.
      • getThreadContextClassLoader

        public static java.lang.ClassLoader getThreadContextClassLoader()
        Looks up the ClassLoader for this current thread. If this class does not have the runtime permission getClassLoader, then the only ClassLoader this attempts to look up is the loader behind this class. When a SecurityManager is installed, this attempts to make a privileged call to get the current thread context ClassLoader, falling back to either the ClassLoader of this class or the system ClassLoader. When no SecurityManager is present, the same lookups are performed without use of AccessController. If none of these strategies can obtain a ClassLoader, then this returns null.
        Returns:
        the current thread's ClassLoader, a fallback loader, or null if no fallback can be determined
      • getThisClassLoader

        private static java.lang.ClassLoader getThisClassLoader()
      • runPrivileged

        private static <T> T runPrivileged​(java.security.PrivilegedAction<T> action)
      • isClassAvailable

        public static boolean isClassAvailable​(java.lang.String className)
        Determines if a named Class can be loaded or not.
        Parameters:
        className - The class name.
        Returns:
        true if the class could be found or false otherwise.
        Since:
        2.7
      • loadClass

        public static java.lang.Class<?> loadClass​(java.lang.String className)
                                            throws java.lang.ClassNotFoundException
        Loads a class by name. This method respects the IGNORE_TCCL_PROPERTY Log4j property. If this property is specified and set to anything besides false, then the default ClassLoader will be used.
        Parameters:
        className - fully qualified class name to load
        Returns:
        the loaded class
        Throws:
        java.lang.ClassNotFoundException - if the specified class name could not be found
        java.lang.ExceptionInInitializerError - if an exception is thrown during class initialization
        java.lang.LinkageError - if the linkage of the class fails for any other reason
        Since:
        2.1
      • loadClassUnchecked

        public static java.lang.Class<?> loadClassUnchecked​(java.lang.String className)
        Loads and initializes a class given its fully qualified class name. All checked reflective operation exceptions are translated into equivalent LinkageError classes.
        Parameters:
        className - fully qualified class name to load
        Returns:
        the loaded class
        Throws:
        java.lang.NoClassDefFoundError - if the specified class name could not be found
        java.lang.ExceptionInInitializerError - if an exception is thrown during class initialization
        java.lang.LinkageError - if the linkage of the class fails for any other reason
        Since:
        2.22.0
        See Also:
        loadClass(String)
      • newInstanceOf

        public static <T> T newInstanceOf​(java.lang.Class<T> clazz)
                                   throws java.lang.InstantiationException,
                                          java.lang.IllegalAccessException,
                                          java.lang.reflect.InvocationTargetException,
                                          java.lang.NoSuchMethodException
        Loads and instantiates a Class using the default constructor.
        Type Parameters:
        T - the type of the class modeled by the Class object.
        Parameters:
        clazz - The class.
        Returns:
        new instance of the class.
        Throws:
        java.lang.NoSuchMethodException - if no zero-arg constructor exists
        java.lang.SecurityException - if this class is not allowed to access declared members of the provided class
        java.lang.IllegalAccessException - if the class can't be instantiated through a public constructor
        java.lang.InstantiationException - if the provided class is abstract or an interface
        java.lang.reflect.InvocationTargetException - if an exception is thrown by the constructor
        java.lang.ExceptionInInitializerError - if an exception was thrown while initializing the class
        Since:
        2.7
      • newInstanceOfUnchecked

        public static <T> T newInstanceOfUnchecked​(java.lang.Class<T> clazz)
        Creates an instance of the provided class using the default constructor. All checked reflective operation exceptions are translated into LinkageError or InternalException.
        Type Parameters:
        T - the type of the object being instantiated
        Parameters:
        clazz - class to instantiate
        Returns:
        instance of the class
        Throws:
        java.lang.NoSuchMethodError - if no zero-arg constructor exists
        java.lang.SecurityException - if this class is not allowed to access declared members of the provided class
        InternalException - if an exception is thrown by the constructor
        java.lang.InstantiationError - if the provided class is abstract or an interface
        java.lang.IllegalAccessError - if the class cannot be accessed
        Since:
        2.22.0
      • newInstanceOf

        public static <T> T newInstanceOf​(java.lang.String className)
                                   throws java.lang.ClassNotFoundException,
                                          java.lang.IllegalAccessException,
                                          java.lang.InstantiationException,
                                          java.lang.reflect.InvocationTargetException,
                                          java.lang.NoSuchMethodException
        Loads and instantiates a Class using the default constructor.
        Type Parameters:
        T - type the class must be compatible with
        Parameters:
        className - fully qualified class name to load, initialize, and construct
        Returns:
        new instance of the class
        Throws:
        java.lang.ClassNotFoundException - if the class isn't available to the usual ClassLoaders
        java.lang.ExceptionInInitializerError - if an exception was thrown while initializing the class
        java.lang.LinkageError - if the linkage of the class fails for any other reason
        java.lang.ClassCastException - if the class is not compatible with the generic type parameter provided
        java.lang.NoSuchMethodException - if no zero-arg constructor exists
        java.lang.SecurityException - if this class is not allowed to access declared members of the provided class
        java.lang.IllegalAccessException - if the class can't be instantiated through a public constructor
        java.lang.InstantiationException - if the provided class is abstract or an interface
        java.lang.reflect.InvocationTargetException - if an exception is thrown by the constructor
        Since:
        2.1
      • newCheckedInstanceOfProperty

        public static <T> T newCheckedInstanceOfProperty​(java.lang.String propertyName,
                                                         java.lang.Class<T> clazz)
                                                  throws java.lang.ClassNotFoundException,
                                                         java.lang.reflect.InvocationTargetException,
                                                         java.lang.InstantiationException,
                                                         java.lang.IllegalAccessException,
                                                         java.lang.NoSuchMethodException
        Loads and instantiates a class given by a property name.
        Type Parameters:
        T - The type to cast it to.
        Parameters:
        propertyName - The property name to look up a class name for.
        clazz - The class to cast it to.
        Returns:
        new instance of the class given in the property or null if the property was unset.
        Throws:
        java.lang.ClassNotFoundException - if the class isn't available to the usual ClassLoaders
        java.lang.ExceptionInInitializerError - if an exception was thrown while initializing the class
        java.lang.LinkageError - if the linkage of the class fails for any other reason
        java.lang.ClassCastException - if the class is not compatible with the generic type parameter provided
        java.lang.NoSuchMethodException - if no zero-arg constructor exists
        java.lang.SecurityException - if this class is not allowed to access declared members of the provided class
        java.lang.IllegalAccessException - if the class can't be instantiated through a public constructor
        java.lang.InstantiationException - if the provided class is abstract or an interface
        java.lang.reflect.InvocationTargetException - if an exception is thrown by the constructor
        Since:
        2.5
      • newCheckedInstanceOfProperty

        public static <T> T newCheckedInstanceOfProperty​(java.lang.String propertyName,
                                                         java.lang.Class<T> clazz,
                                                         java.util.function.Supplier<T> defaultSupplier)
                                                  throws java.lang.ClassNotFoundException,
                                                         java.lang.reflect.InvocationTargetException,
                                                         java.lang.InstantiationException,
                                                         java.lang.IllegalAccessException,
                                                         java.lang.NoSuchMethodException
        Loads and instantiates a class given by a property name.
        Type Parameters:
        T - The type to cast it to.
        Parameters:
        propertyName - The property name to look up a class name for.
        clazz - The class to cast it to.
        defaultSupplier - Supplier of a default value if the property is not present.
        Returns:
        new instance of the class given in the property or null if the property was unset.
        Throws:
        java.lang.ClassNotFoundException - if the class isn't available to the usual ClassLoaders
        java.lang.ExceptionInInitializerError - if an exception was thrown while initializing the class
        java.lang.LinkageError - if the linkage of the class fails for any other reason
        java.lang.ClassCastException - if the class is not compatible with the generic type parameter provided
        java.lang.NoSuchMethodException - if no zero-arg constructor exists
        java.lang.SecurityException - if this class is not allowed to access declared members of the provided class
        java.lang.IllegalAccessException - if the class can't be instantiated through a public constructor
        java.lang.InstantiationException - if the provided class is abstract or an interface
        java.lang.reflect.InvocationTargetException - if an exception is thrown by the constructor
        Since:
        2.22.0
      • newInstanceOfUnchecked

        public static <T> T newInstanceOfUnchecked​(java.lang.String className)
        Loads and instantiates a class by name using its default constructor. All checked reflective operation exceptions are translated into corresponding LinkageError classes.
        Type Parameters:
        T - type the class must be compatible with
        Parameters:
        className - fully qualified class name to load, initialize, and construct
        Returns:
        new instance of the class
        Throws:
        java.lang.NoClassDefFoundError - if the specified class name could not be found
        java.lang.ExceptionInInitializerError - if an exception is thrown during class initialization
        java.lang.ClassCastException - if the class is not compatible with the generic type parameter provided
        java.lang.NoSuchMethodError - if no zero-arg constructor exists
        java.lang.SecurityException - if this class is not allowed to access declared members of the provided class
        InternalException - if an exception is thrown by the constructor
        java.lang.InstantiationError - if the provided class is abstract or an interface
        java.lang.IllegalAccessError - if the class cannot be accessed
        java.lang.LinkageError - if the linkage of the class fails for any other reason
        Since:
        2.22.0
      • newCheckedInstanceOf

        public static <T> T newCheckedInstanceOf​(java.lang.String className,
                                                 java.lang.Class<T> clazz)
                                          throws java.lang.ClassNotFoundException,
                                                 java.lang.reflect.InvocationTargetException,
                                                 java.lang.InstantiationException,
                                                 java.lang.IllegalAccessException,
                                                 java.lang.NoSuchMethodException
        Loads and instantiates a derived class using its default constructor.
        Type Parameters:
        T - The type of the class to check.
        Parameters:
        className - The class name.
        clazz - The class to cast it to.
        Returns:
        new instance of the class cast to T
        Throws:
        java.lang.ClassNotFoundException - if the class isn't available to the usual ClassLoaders
        java.lang.ExceptionInInitializerError - if an exception is thrown during class initialization
        java.lang.LinkageError - if the linkage of the class fails for any other reason
        java.lang.ClassCastException - if the constructed object isn't type compatible with T
        java.lang.NoSuchMethodException - if no zero-arg constructor exists
        java.lang.SecurityException - if this class is not allowed to access declared members of the provided class
        java.lang.IllegalAccessException - if the class can't be instantiated through a public constructor
        java.lang.InstantiationException - if the provided class is abstract or an interface
        java.lang.reflect.InvocationTargetException - if there was an exception whilst constructing the class
        Since:
        2.1
      • newInstanceOfUnchecked

        public static <T> T newInstanceOfUnchecked​(java.lang.String className,
                                                   java.lang.Class<T> supertype)
        Loads the provided class by name as a checked subtype of the given class. All checked reflective operation exceptions are translated into corresponding LinkageError classes.
        Type Parameters:
        T - type of instance to return
        Parameters:
        className - fully qualified class name to load
        supertype - supertype of the class being loaded
        Returns:
        new instance of the requested class
        Throws:
        java.lang.NoClassDefFoundError - if the provided class name could not be found
        java.lang.ExceptionInInitializerError - if an exception is thrown during class initialization
        java.lang.ClassCastException - if the loaded class is not a subtype of the provided class
        java.lang.NoSuchMethodError - if no zero-arg constructor exists
        java.lang.SecurityException - if this class is not allowed to access declared members of the provided class
        InternalException - if an exception is thrown by the constructor
        java.lang.InstantiationError - if the provided class is abstract or an interface
        java.lang.IllegalAccessError - if the class cannot be accessed
        java.lang.LinkageError - if the linkage of the class fails for any other reason
        Since:
        2.22.0
      • isIgnoreTccl

        private static boolean isIgnoreTccl()
      • findResources

        public static java.util.Collection<java.net.URL> findResources​(java.lang.String resource)
        Finds classpath resources.
        Parameters:
        resource - the name of the resource to find.
        Returns:
        a Collection of URLs matching the resource name. If no resources could be found, then this will be empty.
        Since:
        2.1
      • findResources

        static java.util.Collection<java.net.URL> findResources​(java.lang.String resource,
                                                                boolean useTccl)
      • findUrlResources

        static java.util.Collection<LoaderUtil.UrlResource> findUrlResources​(java.lang.String resource,
                                                                             boolean useTccl)