Phase 12 of 20 · Topic 12.4

JPMS Module System (Java 9+ module-info.java)

1Concept

The Java Platform Module System (JPMS) introduced strong encapsulation and reliable configuration. Modules declare dependencies explicitly via `requires` and export packages via `exports` in a `module-info.java` file. Internal packages cannot be accessed even via reflection unless explicitly opened via `opens`.

2Architecture Diagram

module com.enterprise.billing {
    requires java.sql;                  // Explicit dependency
    requires transitive java.logging;   // Transitive dependency
    exports com.enterprise.billing.api; // Publicly visible API
    // Internal packages hidden!
}

3Code Example

Core Java
// Simulated module descriptor demonstration:
public class ModuleSystemDemo {
    public static void main(String[] args) {
        Module currentModule = ModuleSystemDemo.class.getModule();
        System.out.println("Current Module Name: " + (currentModule.isNamed() ? currentModule.getName() : "Unnamed Module"));
        System.out.println("Module ClassLoader: " + currentModule.getClassLoader());
        System.out.println("Java Base Module: " + Object.class.getModule().getName());
    }
}

4Expected Output

Current Module Name: Unnamed Module
Module ClassLoader: jdk.internal.loader.ClassLoaders$AppClassLoader
Java Base Module: java.base

5Key Takeaways

  • `java.base` module is required automatically by all Java modules.
  • `exports` makes packages public at compile-time and runtime.
  • `opens` permits deep reflection access (required by frameworks like Spring / Hibernate).