jol在Java9下是否有点破?

Posted

技术标签:

【中文标题】jol在Java9下是否有点破?【英文标题】:Is jol a little broken under Java9?jol在Java9下是不是有点破? 【发布时间】:2017-05-10 22:25:34 【问题描述】:

使用 java-9 build 9-ea+149 和 jol 0.6

运行这个简单的代码:

ArrayList<Integer> list = new ArrayList<>();
list.add(12);

System.out.println(ClassLayout.parseInstance(list).toPrintable());

输出:

  OFFSET  SIZE     TYPE DESCRIPTION                    VALUE
  0     4          (object header)                01 00 00 00 (00000001 00000000 00000000 00000000) (1)
  4     4          (object header)                00 00 00 00 (00000000 00000000 00000000 00000000) (0)
  8     4          (object header)                0e 8d 00 f8 (00001110 10001101 00000000 11111000) (-134181618)
 12     4      int AbstractList.modCount          (access denied)
 16     4      int ArrayList.size                 (access denied)
 20     4 Object[] ArrayList.elementData          (access denied)

这个访问被拒绝部分来自方法中的FieldData.java:

public String safeValue(Object object) 
    if (refField != null) 
        try 
            return ObjectUtils.safeToString(refField.get(object));
         catch (IllegalAccessException iae) 
            // exception, try again
        

        try 
            refField.setAccessible(true);
            return ObjectUtils.safeToString(refField.get(object));
         catch (Exception e) 
            return "(access denied)";
        
     else 
        return "N/A";
    

实际的例外是:

无法使字段受保护的瞬态 int java.util.AbstractList.modCount 可访问:模块 java.base 不会“打开 java.util”到未命名的模块 @479d31f3。

我认为这与不安全功能被锁定有关。问题是我如何让它运行?

我看过类似的属性:

-XaddExports:java.base/sun.security.provider=ALL-UNNAMED

但不能真正说出它应该是什么样子。

【问题讨论】:

根据你的假设;你不会的。 Java 9 正在锁定 Unsafe,就这么简单。 @Esko 在这里失败不是不安全,而是反射。 相关:***.com/questions/41265266/… @JornVernee 非常感谢!确实在那里找到了我的解决方案 小破可以小修:bugs.openjdk.java.net/browse/CODETOOLS-7901884。应该在 JOL 0.7+ 中可用。 【参考方案1】:

解决方案确实是提出正确的论点..

--add-opens java.base/java.util=ALL-UNNAMED

如建议here

【讨论】:

以上是关于jol在Java9下是否有点破?的主要内容,如果未能解决你的问题,请参考以下文章

使用maven构建java9 service实例

Linux java9 jshell操作

Java9新特性

java9环境变量配置bat

Java9新特性

java9新特性-6-多版本兼容jar包