1Z0-826-JPN 対応
モジュール(exports vs opens)難易度 高無料

モジュール com.lib が次のように宣言されている(exports は無く opens のみ)。

1   module com.lib {
2       opens com.lib.model;             // public class Entity を含む
3   }

別モジュール com.client(requires com.lib;)が、ソースコードで次のように com.lib.model.Entity を直接 import して使おうとする。結果は?

4   package com.client;
5   import com.lib.model.Entity;
6   public class Main {
7       public static void main(String[] a) {
8           System.out.println(new Entity().name());
9       }
10  }
  1. Aコンパイル成功。opens により com.client は com.lib.model の public 型をコンパイル時に参照できる。
  2. Bコンパイルエラー。opens は実行時のリフレクティブアクセスのみを許可し、コンパイル時/通常コードの型参照は exports でなければ許可されない。
  3. Cコンパイルは成功するが、実行時に IllegalAccessException がスローされる。
  4. Dopens と exports は同義であり、どちらを書いても結果は同じ。
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:B✓有資格者監修

解説

exports と opens は「公開」の意味がまったく違う。1段ずつ整理する。

exports com.x = 他モジュールが com.x の public 型の public メンバを、コンパイル時も実行時も通常コードから使える。
opens com.x = 他モジュールが com.x に実行時の深いリフレクション(setAccessible(true) を含む。private にも届く)でアクセスできる。ただし通常のコンパイル時の型参照は許可しない。

opens はフレームワーク(Jackson の JSON マッピング、JPA、DI 等)が privateフィールドにリフレクションで触るために使うもの。 本問の com.client は import して new Entity() という通常のコンパイル時参照をしているので、opens しかない com.lib.model は「コンパイルからは見えない」。よってコンパイルエラー。

各誤答が違う理由
  • Aopens はコンパイル時可視性を与えない。通常の import/new は通らない。
  • Cそもそもコンパイルが通らないので、実行時例外に至らない。
  • D同義ではない。exports=通常アクセス(public のみ)、opens=実行時リフレクション(private 含む)。役割が直交する。
ひっかけ: 「opens の方が private まで開くんだから、当然 public も使えるはず(exports の上位互換)」という直感。実際は軸が別で、コンパイル時参照は exports 専用。両方欲しければ両方書く(exports+opens)。
実機確認の答え合わせ
opens のみの com.lib.model を client が import → javac がコンパイルエラー:
Main.java:5: error: package com.lib.model does not exist
import com.lib.model.Entity;
                    ^
Main.java:8: error: cannot find symbol  (class Entity)
✓有資格者(著者)による書き下ろし解説

有資格者(著者)が監修した問題は、すべて無料サンプルとして公開しています。買う前に、その全部を実際に解いて解説まで読めます。有料で追加される問題はAIが作成したもので、有資格者の監修は入っていません。

この問題集の作り方

  1. 問題と解説はAIが作成しています。有資格者(著者)が監修した問題は、無料サンプルとして公開している分だけです。有料で追加される問題に監修は入っていません。
  2. 各問に、公式ドキュメントの出典リンクを付けています。書いてあることは、出典に当たって確かめられます。
  3. 誤答の選択肢それぞれに、なぜ誤りなのかの理由を書いています。
  4. 解説に載せているコンパイル結果は、実際に javac を走らせた出力です。想定した挙動ではありません。
  5. 誤りを見つけたら報告できます。原則として無償で訂正・削除します。
  6. 各試験の運営団体とは無関係の非公式教材です。合格を保証するものではありません。
この分野をもっと解いて、得点源に
モジュール を含む問題を分野別に演習できます。
演習する →