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下是否有点破?的主要内容,如果未能解决你的问题,请参考以下文章