Class Module


  • public final class Module
    extends java.lang.Object
    A module is a unit of classes and other resources, along with the specification of what is imported and exported by this module from and to other modules. Modules are created by ModuleLoaders which build modules from various configuration information and resource roots.
    • Field Detail

      • BOOT_MODULE_LOADER

        private static final java.util.concurrent.atomic.AtomicReference<ModuleLoader> BOOT_MODULE_LOADER
      • systemPackages

        static final java.lang.String[] systemPackages
      • systemPaths

        static final java.lang.String[] systemPaths
      • identifier

        private final ModuleIdentifier identifier
        The identifier of this module.
      • mainClassName

        private final java.lang.String mainClassName
        The name of the main class, if any (may be null).
      • moduleClassLoader

        private final ModuleClassLoader moduleClassLoader
        The module class loader for this module.
      • moduleLoader

        private final ModuleLoader moduleLoader
        The module loader which created this module.
      • fallbackLoader

        private final LocalLoader fallbackLoader
        The fallback local loader, if any is defined.
      • properties

        private final java.util.Map<java.lang.String,​java.lang.String> properties
        The properties map specified when this module was defined.
      • permissionCollection

        private final java.security.PermissionCollection permissionCollection
        The assigned permission collection.
      • linkage

        private volatile Linkage linkage
        The linkage state.
      • GET_DEPENDENCIES

        private static final java.lang.RuntimePermission GET_DEPENDENCIES
      • GET_CLASS_LOADER

        private static final java.lang.RuntimePermission GET_CLASS_LOADER
      • GET_BOOT_MODULE_LOADER

        private static final java.lang.RuntimePermission GET_BOOT_MODULE_LOADER
      • ACCESS_MODULE_LOGGER

        private static final java.lang.RuntimePermission ACCESS_MODULE_LOGGER
      • ADD_CONTENT_HANDLER_FACTORY

        private static final java.lang.RuntimePermission ADD_CONTENT_HANDLER_FACTORY
      • ADD_URL_STREAM_HANDLER_FACTORY

        private static final java.lang.RuntimePermission ADD_URL_STREAM_HANDLER_FACTORY
      • NO_PERMISSIONS

        private static final java.security.PermissionCollection NO_PERMISSIONS
    • Constructor Detail

      • Module

        Module​(ConcreteModuleSpec spec,
               ModuleLoader moduleLoader)
        Construct a new instance from a module specification.
        Parameters:
        spec - the module specification
        moduleLoader - the module loader
    • Method Detail

      • getPrivateAccess

        public static ModulesPrivateAccess getPrivateAccess()
        Private access for module internal code. Throws SecurityException for user code.
        Throws:
        java.lang.SecurityException - always
      • noPermissions

        private static java.security.PermissionCollection noPermissions()
      • copyPermissions

        private static java.security.PermissionCollection copyPermissions​(java.security.PermissionCollection permissionCollection)
      • getDependenciesInternal

        Dependency[] getDependenciesInternal()
      • getDependencySpecsInternal

        DependencySpec[] getDependencySpecsInternal()
      • getDependencies

        public DependencySpec[] getDependencies()
                                         throws java.lang.SecurityException
        Get the current dependencies of this module.
        Returns:
        the current dependencies of this module
        Throws:
        java.lang.SecurityException - if a security manager is enabled and the caller does not have the getDependencies RuntimePermission
      • getExportedResource

        public Resource getExportedResource​(java.lang.String rootPath,
                                            java.lang.String resourcePath)
        Get an exported resource from a specific root in this module.
        Parameters:
        rootPath - the module root to search
        resourcePath - the path of the resource
        Returns:
        the resource
      • run

        public void run​(java.lang.String[] args)
                 throws java.lang.NoSuchMethodException,
                        java.lang.reflect.InvocationTargetException,
                        java.lang.ClassNotFoundException
        Run a module's main class, if any.
        Parameters:
        args - the arguments to pass
        Throws:
        java.lang.NoSuchMethodException - if there is no main method
        java.lang.reflect.InvocationTargetException - if the main method failed
        java.lang.ClassNotFoundException - if the main class is not found
      • getIdentifier

        public ModuleIdentifier getIdentifier()
        Get this module's identifier.
        Returns:
        the identifier
      • getModuleLoader

        public ModuleLoader getModuleLoader()
        Get the module loader which created this module.
        Returns:
        the module loader of this module
      • loadService

        public <S> java.util.ServiceLoader<S> loadService​(java.lang.Class<S> serviceType)
        Load a service loader from this module.
        Type Parameters:
        S - the service type
        Parameters:
        serviceType - the service type class
        Returns:
        the service loader
      • loadServiceDirectly

        public <S> java.util.ServiceLoader<S> loadServiceDirectly​(java.lang.Class<S> serviceType)
        Load a service loader from this module, without looking at dependencies.
        Type Parameters:
        S - the service type
        Parameters:
        serviceType - the service type class
        Returns:
        the service loader
      • loadServiceFromCallerModuleLoader

        public static <S> java.util.ServiceLoader<S> loadServiceFromCallerModuleLoader​(ModuleIdentifier identifier,
                                                                                       java.lang.Class<S> serviceType)
                                                                                throws ModuleLoadException
        Load a service loader from a module in the caller's module loader. The caller's module loader refers to the loader of the module of the class that calls this method. Note that loadService(Class) is more efficient since it does not need to crawl the stack.
        Type Parameters:
        S - the the service type
        Parameters:
        identifier - the module identifier containing the service loader
        serviceType - the service type class
        Returns:
        the loaded service from the caller's module
        Throws:
        ModuleLoadException - if the named module failed to load
      • getClassLoader

        public ModuleClassLoader getClassLoader()
        Get the class loader for a module. The class loader can be used to access non-exported classes and resources of the module.

        If a security manager is present, then this method invokes the security manager's checkPermission method with a RuntimePermission("getClassLoader") permission to verify access to the class loader. If access is not granted, a SecurityException will be thrown.

        Returns:
        the module class loader
      • getExportedPaths

        public java.util.Set<java.lang.String> getExportedPaths()
        Get all the paths exported by this module.
        Returns:
        the paths that are exported by this module
      • forClass

        public static Module forClass​(java.lang.Class<?> clazz)
        Get the module for a loaded class, or null if the class did not come from any module.
        Parameters:
        clazz - the class
        Returns:
        the module it came from
      • forClassLoader

        public static Module forClassLoader​(java.lang.ClassLoader cl,
                                            boolean search)
        Get the module for a class loader, or null if the class loader is not associated with any module. If the class loader is unknown, it is possible to check the parent class loader up the chain, and so on until a module is found.
        Parameters:
        cl - the class loader
        search - true to search up the delegation chain
        Returns:
        the associated module
      • getBootModuleLoader

        public static ModuleLoader getBootModuleLoader()
        Gets the boot module loader. The boot module loader is the initial loader that is established by the module framework. It typically is based off of the environmental module path unless it is overridden by specifying a different class name for the boot.module.loader system property.
        Returns:
        the boot module loader
      • initBootModuleLoader

        static void initBootModuleLoader​(ModuleLoader loader)
      • getCallerModuleLoader

        public static ModuleLoader getCallerModuleLoader()
        Gets the current module loader. The current module loader is the loader of the module from the calling class. Note that this method must crawl the stack to determine this, so other mechanisms are more efficient.
        Returns:
        the current module loader, or null if this method is called outside of a module
      • getContextModuleLoader

        public static ModuleLoader getContextModuleLoader()
        Get the current thread's context module loader. This loader is the one which defined the module whose class loader is, or is a parent of, the thread's current context class loader. If there is none, then null is returned.
        Returns:
        the module loader, or null if none is set
      • getModuleFromCallerModuleLoader

        public static Module getModuleFromCallerModuleLoader​(ModuleIdentifier identifier)
                                                      throws ModuleLoadException
        Get a module from the current module loader. Note that this must crawl the stack to determine this, so other mechanisms are more efficient.
        Parameters:
        identifier - the module identifier
        Returns:
        the module
        Throws:
        ModuleLoadException - if the module could not be loaded
        See Also:
        getCallerModuleLoader()
      • getCallerModule

        public static Module getCallerModule()
        Get the caller's module. The caller's module is the module containing the method that calls this method. Note that this method crawls the stack so other ways of obtaining the module are more efficient.
        Returns:
        the current module
      • loadClassFromBootModuleLoader

        public static java.lang.Class<?> loadClassFromBootModuleLoader​(ModuleIdentifier moduleIdentifier,
                                                                       java.lang.String className)
                                                                throws ModuleLoadException,
                                                                       java.lang.ClassNotFoundException
        Load a class from a module in the system module loader.
        Parameters:
        moduleIdentifier - the identifier of the module from which the class should be loaded
        className - the class name to load
        Returns:
        the class
        Throws:
        ModuleLoadException - if the module could not be loaded
        java.lang.ClassNotFoundException - if the class could not be loaded
        See Also:
        getBootModuleLoader()
      • loadClassFromCallerModuleLoader

        public static java.lang.Class<?> loadClassFromCallerModuleLoader​(ModuleIdentifier moduleIdentifier,
                                                                         java.lang.String className)
                                                                  throws ModuleLoadException,
                                                                         java.lang.ClassNotFoundException
        Load a class from a module in the caller's module loader.
        Parameters:
        moduleIdentifier - the identifier of the module from which the class should be loaded
        className - the class name to load
        Returns:
        the class
        Throws:
        ModuleLoadException - if the module could not be loaded
        java.lang.ClassNotFoundException - if the class could not be loaded
        See Also:
        getCallerModuleLoader()
      • loadModuleClass

        java.lang.Class<?> loadModuleClass​(java.lang.String className,
                                           boolean resolve)
                                    throws java.lang.ClassNotFoundException
        Load a class from a local loader.
        Parameters:
        className - the class name
        resolve - true to resolve the class after definition
        Returns:
        the class
        Throws:
        java.lang.ClassNotFoundException
      • getResource

        java.net.URL getResource​(java.lang.String name)
        Load a resource from a local loader.
        Parameters:
        name - the resource name
        Returns:
        the resource URL, or null if not found
      • getResourceAsStream

        java.io.InputStream getResourceAsStream​(java.lang.String name)
                                         throws java.io.IOException
        Load a resource from a local loader.
        Parameters:
        name - the resource name
        Returns:
        the resource stream, or null if not found
        Throws:
        java.io.IOException
      • getResources

        java.util.Enumeration<java.net.URL> getResources​(java.lang.String name)
        Load all resources of a given name from a local loader.
        Parameters:
        name - the resource name
        Returns:
        the enumeration of all the matching resource URLs (may be empty)
      • getExportedResource

        public java.net.URL getExportedResource​(java.lang.String name)
        Get an exported resource URL.
        Parameters:
        name - the resource name
        Returns:
        the resource, or null if it was not found
      • getExportedResources

        public java.util.Enumeration<java.net.URL> getExportedResources​(java.lang.String name)
        Get all exported resource URLs for a resource name.
        Parameters:
        name - the resource name
        Returns:
        the resource URLs
      • iterateResources

        public java.util.Iterator<Resource> iterateResources​(PathFilter filter)
                                                      throws ModuleLoadException
        Enumerate all the imported resources in this module, subject to a path filter. The filter applies to the containing path of each resource.
        Parameters:
        filter - the filter to apply to the search
        Returns:
        the resource iterator (possibly empty)
        Throws:
        ModuleLoadException - if linking a dependency module fails for some reason
      • globResources

        public java.util.Iterator<Resource> globResources​(java.lang.String glob)
                                                   throws ModuleLoadException
        Enumerate all imported resources in this module which match the given glob expression. The glob applies to the whole resource name.
        Parameters:
        glob - the glob to apply
        Returns:
        the iterator
        Throws:
        ModuleLoadException - if linking a dependency module fails for some reason
      • getImportedPaths

        public java.util.Set<java.lang.String> getImportedPaths()
                                                         throws ModuleLoadException
        Get the (unmodifiable) set of paths which are imported into this module class loader, including local paths. The set will include all paths defined by the module's resource loaders, minus any paths excluded by filters. The set will generally always contain an empty entry (""). The set is unordered and unsorted, and is iterable in O(n) time and accessible in O(1) time.
        Returns:
        the set of paths
        Throws:
        ModuleLoadException - if the module was previously unlinked, and there was an exception while linking
      • pathOfClass

        static java.lang.String pathOfClass​(java.lang.String className)
        Get the path name of a class.
        Parameters:
        className - the binary name of the class
        Returns:
        the parent path
      • pathOf

        static java.lang.String pathOf​(java.lang.String resourceName)
        Get the path name of a resource.
        Parameters:
        resourceName - the resource name
        Returns:
        the parent path
      • fileNameOfClass

        static java.lang.String fileNameOfClass​(java.lang.String className)
        Get the file name of a class.
        Parameters:
        className - the class name
        Returns:
        the name of the corresponding class file
      • getProperty

        public java.lang.String getProperty​(java.lang.String name)
        Get the property with the given name, or null if none was defined.
        Parameters:
        name - the property name
        Returns:
        the property value
      • getProperty

        public java.lang.String getProperty​(java.lang.String name,
                                            java.lang.String defaultVal)
        Get the property with the given name, or a default value if none was defined.
        Parameters:
        name - the property name
        defaultVal - the default value
        Returns:
        the property value
      • getPropertyNames

        public java.util.List<java.lang.String> getPropertyNames()
        Get a copy of the list of property names.
        Returns:
        the property names list
      • toString

        public java.lang.String toString()
        Get the string representation of this module.
        Overrides:
        toString in class java.lang.Object
        Returns:
        the string representation
      • getModuleLogger

        public static ModuleLogger getModuleLogger()
        Get the logger used by the module system.

        If a security manager is present, then this method invokes the security manager's checkPermission method with a RuntimePermission("accessModuleLogger") permission to verify access to the module logger. If access is not granted, a SecurityException will be thrown.

        Returns:
        the module logger
      • setModuleLogger

        public static void setModuleLogger​(ModuleLogger logger)
        Change the logger used by the module system.

        If a security manager is present, then this method invokes the security manager's checkPermission method with a RuntimePermission("accessModuleLogger") permission to verify access to the module logger. If access is not granted, a SecurityException will be thrown.

        Parameters:
        logger - the new logger, must not be null
      • getStartTime

        public static long getStartTime()
        Return the start time in millis when Module.class was loaded.
        Returns:
        start time of Module.class load
      • registerContentHandlerFactoryModule

        public static void registerContentHandlerFactoryModule​(Module module)
        Register an additional module which contains content handlers.

        If a security manager is present, then this method invokes the security manager's checkPermission method with a RuntimePermission("addContentHandlerFactory") permission to verify access. If access is not granted, a SecurityException will be thrown.

        Parameters:
        module - the module to add
      • registerURLStreamHandlerFactoryModule

        public static void registerURLStreamHandlerFactoryModule​(Module module)
        Register an additional module which contains URL handlers.

        If a security manager is present, then this method invokes the security manager's checkPermission method with a RuntimePermission("addURLStreamHandlerFactory") permission to verify access. If access is not granted, a SecurityException will be thrown.

        Parameters:
        module - the module to add
      • getPlatformIdentifier

        public static java.lang.String getPlatformIdentifier()
        Get the platform identifier. This is the string that uniquely identifies the hardware and OS combination for the current running system.
        Returns:
        the platform identifier
      • getPermissionCollection

        public java.security.PermissionCollection getPermissionCollection()
        Get the module's configured permission collection.
        Returns:
        the module permission collection
      • getPathsUnchecked

        java.util.Map<java.lang.String,​java.util.List<LocalLoader>> getPathsUnchecked()
      • setDependencies

        void setDependencies​(java.util.List<DependencySpec> dependencySpecs)
      • setDependencies

        void setDependencies​(DependencySpec[] dependencySpecs)
      • getMainClass

        java.lang.String getMainClass()
      • getPackage

        java.lang.Package getPackage​(java.lang.String name)
      • getPackages

        java.lang.Package[] getPackages()