~.jar 형태로 존재JAR 파일에는 클래스와 인터페이스의 바이트코드 파일(~.class)들이 압축되어 있음package app;
import pack1.A;
import pack2.B;
public class Main {
public static void main(String[] args) {
A a = new A();
a.method();
B b = new B();
b.method();
}
}


jar 파일 형태로 배포 가능
my_application_2 응용프로그램은 2개의 my_moudle_a, my_module_b로 쪼개어 개발하고, 이들을 조합해서 완성 했다.
my_module_a / src / module-info.java
module my_module_a {
exports pack1; //pack1 사용가능
//exports pack2; //pack2 사용불가
}
my_module_b / src / module-info.java
module my_module_b {
exports pack3; //pack3 사용가능
exports pack4; //pack4 사용가능
}

my_application_2 / src / module-info.java
module my_application_2 {
requires my_module_a; // my_module_a를 필요로 함
requires my_module_b; // my_module_b를 필요로 함
}
my_application_2 / src / app / main.java
package app;
import pack1.A;
import pack2.B; // 오류
import pack3.C;
import pack4.D;
public class main {
public static void main(String[] args) {
A a = new A();
a.method();
B b = new B(); // 오류
b.method(); // 오류
C c = new C();
c.method();
D d = new D();
d.method();
}
}

10.3은 프로젝트 형식으로 모듈을 조합해서 응용프로그램을 완성했지만
10.4는 서브 모듈을 jar파일로 압축하여 라이브러리 형식으로 모듈을 조합해서 응용프로그램을 완성했다.

모듈 외부에서 pack2와 pack3를 사용하지 못하도록 설정함

my_application_2 모듈이 my_module_b를 사용할 수 없음
my_application_2 / src / module-info.java
module my_application_2 {
requires my_module_a; // my_module_a를 필요로 함
}
my_module_a / src / module-info.java
module my_module_a {
exports pack1; // pack1 사용가능
requires my_module_b; // my_module_b를 필요로 함
}
my_application_2 모듈이 my_module_b를 사용할 수 있게 하는 방법
transitive 사용

my_application_2 / src / module-info.java
module my_application_2 {
requires my_module_a; // my_module_a를 필요로 함
}
my_module_a / src / module-info.java
module my_module_a {
exports pack1; // pack1 사용가능
requires transitive my_module_b; // my_module_b를 필요로 함
// transitive 사용
}
requires 하는 번거로움을 피할 수 있음
module-info.java
module my_module {
requires transitive my_module_a;
requires transitive my_module_b;
}
module-info.java 파일만 있는 my_module모듈
my_module을 requires 하면 my_module_a, my_module_b 모두 사용가능
리플렉션 : 프로그램 실행 도중에 타입(클래스, 인터페이스 등)을 검사하고 구성 맴버를 조사하는 것을 말함

은닉된 패키지는 기본적으로 다른 모듈에 의해 리플렉션을 허용하지 않음
open module 모듈명 {
} // 모듈 전체를 리플렉션 허용
module 모듈명 {
opens 패키지1;
opens 패키지2;
} // 지정된 패키지에 대해 리플렉션 허용
module 모듈명 {
opens 패키지1 to 외부모듈명, 외부모듈명...
} // 지정된 패키지에 대해 특정 외부 모듈에서만 리플렉션 허용
java.se는 JDK가 제공하는 모든 모듈을 제공하는 모듈 집합이다.JRE)을 만들기 위해서이다.