こんにちは、開発担当の Masa です。

Java系製品の開発担当としては Java9 のリリースが待ち遠しいような怖いような今日この頃です。
一番の目玉機能である Jigsaw ですが、コンパイラー準拠レベル1.8でコンパイルするとモジュール間のアクセス制御はどうなるんだろう?という素朴な疑問を確かめてみました。

呼び出される側のモジュールです。

誰でも使えるモジュール jp.co.hos.blog

package jp.co.hos.blog;

import jp.co.hos.internal.MyClass;

public class Common {
  public void execute() {
    System.out.println(this.getClass().getName());

    MyClass m = new MyClass();
    m.out();
  }
}

内部で使うモジュール jp.co.hos.internal

package jp.co.hos.internal;

public class MyClass {
  public void out() {
    System.out.println(this.getClass().getName());
  }
}

jp.co.hos.blog のみ公開するための module-info.java

module hoge {
  exports jp.co.hos.blog;
}




呼び出す側のモジュールです。

使用する側のクラス

import jp.co.hos.internal.MyClass;

public class Test {
  public static void main(String[] args) {
    MyClass m = new MyClass();
    m.out();
  }
}

アクセス不可能なので、当然「is not accessible」って怒られます。



呼び出される側をコンパイラー準拠レベル1.8でコンパイルします。


module-info.java のコンパイルが通りません。ですよね。知ってました。
以上です。

  • 2017/08/17 修正: module-info.java の説明が別パッケージ名になっていたので修正。