Master the Java Platform Module System (JPMS) including module definition, module-info.java, module content exposure, and reflection and modules for the OCP 21 exam.
Table of Contents
1. Modules Overview
The Java Platform Module System (JPMS), introduced in Java 9, provides a way to organize code into modules with explicit dependencies and encapsulation.
1.1 What are Modules?
A module is a collection of packages with a module descriptor (module-info.java). Modules provide:
- Strong Encapsulation: Packages are not accessible unless explicitly exported
- Explicit Dependencies: Modules must declare their dependencies
- Reliable Configuration: Module system validates dependencies at startup
1.2 Benefits of Modules
- Better organization and structure
- Improved security through encapsulation
- Faster startup times
- Smaller runtime images
- Clearer dependencies
2. Module Definition
2.1 Module Structure
// Module directory structure
com.example.mymodule/
module-info.java
com/
example/
mymodule/
MyClass.java
AnotherClass.java
2.2 Module Naming
- Module names should follow reverse domain naming convention
- Use dots to separate components:
com.example.mymodule - Module names are case-sensitive
- Avoid using reserved keywords
3. module-info.java
The module-info.java file is the module descriptor that defines the module's name, dependencies, and exports.
3.1 Basic Module Declaration
// Simple module with no dependencies or exports
module com.example.mymodule {
}
// Module with dependencies
module com.example.mymodule {
requires java.base; // Implicit, but can be explicit
requires java.sql;
requires com.example.othermodule;
}
// Module with exports
module com.example.mymodule {
exports com.example.mymodule.api;
exports com.example.mymodule.util;
}
4. Module Directives
4.1 requires Directive
The requires directive declares a dependency on another module.
module com.example.mymodule {
requires java.sql; // Standard dependency
requires com.example.othermodule; // Application module dependency
requires static com.example.optional; // Optional dependency (compile-time only)
requires transitive java.logging; // Transitive dependency (re-exported)
}
4.2 exports Directive
The exports directive makes packages accessible to other modules.
module com.example.mymodule {
exports com.example.mymodule.api; // Export to all modules
exports com.example.mymodule.util to com.example.consumer; // Export to specific module
}
4.3 opens Directive
The opens directive allows reflective access to packages (for frameworks like Spring, Hibernate).
module com.example.mymodule {
opens com.example.mymodule.internal; // Open to all modules
opens com.example.mymodule.config to com.example.framework; // Open to specific module
open module com.example.mymodule { } // Open entire module
}
4.4 uses and provides Directives
// Service interface
package com.example.service;
public interface MyService { }
// Service implementation
package com.example.impl;
public class MyServiceImpl implements MyService { }
// Consumer module
module com.example.consumer {
uses com.example.service.MyService; // Uses the service
}
// Provider module
module com.example.provider {
provides com.example.service.MyService
with com.example.impl.MyServiceImpl; // Provides implementation
}
5. Reflection and Modules
Modules affect reflection access. By default, reflection cannot access non-exported packages.
5.1 Reflection Restrictions
// Module com.example.mymodule does NOT export com.example.mymodule.internal
module com.example.mymodule {
exports com.example.mymodule.api;
// com.example.mymodule.internal is NOT exported
}
// In another module - this will fail
Class<?> clazz = Class.forName("com.example.mymodule.internal.InternalClass");
// IllegalAccessException - package not exported
// Solution: Use opens directive
module com.example.mymodule {
opens com.example.mymodule.internal; // Allow reflection access
}
6. Exam Key Points
Critical Concepts for OCP 21 Exam:
- Module: Collection of packages with module-info.java
- module-info.java: Module descriptor file
- requires: Declares dependency on another module
- exports: Makes packages accessible to other modules
- opens: Allows reflective access to packages
- uses: Declares use of a service interface
- provides: Provides service implementation
- transitive: Re-exports dependency to dependent modules
- static: Optional dependency (compile-time only)
- java.base: Implicitly required by all modules
- Reflection: Restricted to exported/opened packages
- Module Naming: Reverse domain naming convention
0 Comments