1.module

模块

此片段说明了模块的作用.

模块, Java9 开始引入的一个新的系统

  • 模块可以定义其他模块可以访问该模块的什么东西
  • 该模块的东西有什么不能被访问
  • 模块权限控制是包级别

为了更好的明白该文章是如何进行越权的, 我们会先给出一个例子, 便于理解

  • 假设有一个模块 protected
    • protected0.Class0
    • protected0.Class1
    • protected0.Class2
    • protected1.Class1
  • 有另外一个模块 hacker
  • 模块 protected export 了 protected0 这个给了hacker
    • hacker 可以随便访问并使用 protected0 这个包的内容
    • hacker 依然没有 protected1 的访问权, 但是 hacker 不需要 protected1 的任何内容
  • 如果模块 protected 并没有 export protected0hacker
    • 那么 hacker 访问 protected0 就会得到一个 java.lang.IllegalAccessError

此时…

  • hacker 就是 module UnsafeAccessor
  • protected 就是 module java.base
  • protected0 就是 jdk.internal.access

模块的划分

在同一个 ClassLoader

假设有以下模块

  • module m1
    • package m1.m1
    • package m1.m2
  • module m2
    • package m2.m1
    • package m2.m2

当往该 ClassLoader define 一个 Class 的时候, 会自动划分 module.

  • 如果包名是 m1.m1 -> 归 module m1
  • 如果包名是 m1.m2 -> 归 module m1
  • .
  • 如果包名是 m2.m1 -> 归 module m2
  • 如果包名是 m2.m2 -> 归 module m2
  • …..
  • 该class归 ClassLoader#getUnnamedModule()