Java模块系统是否为合成字段损坏?



我正在用java模块系统测试一些字节码生成库。我已经编译了java 11,并对java进行了以下更改。基地module-info.java:

module java.base {
...
exports java.lang.reflect to <some java and custom modules>;
...
}

然后我用"——illegal-access=deny"选择。当我在javassist库中使用这个编译后的java版本时,它在未命名模块中生成以下类:

public class SomeJavassistProxy extends SomeClass implements WriteReplaceInterface, ProxyObject {
private MethodHandler handler;
private static Method[] _methods_;
...

Java抛出了一些" Java .lang。类SomeJavassistProxy(在未命名模块中)无法访问类java.lang.reflect。方法(在模块java.base中),因为模块java。Base不将java.lang.reflect导出到未命名模块"。

这是预期的行为。

然后我尝试了bytebuddy库,它生成了以下类:

public class SomeClass$HibernateProxy$7DKVefUe extends SomeClass implements HibernateProxy, ProxyConfiguration {
private Interceptor $$_hibernate_interceptor;
// $FF: synthetic field
private static final Method cachedValue$ghVgnbHc$4cscpe1 = Object.class.getMethod("toString");
// $FF: synthetic field
private static final Method cachedValue$ghVgnbHc$o23rrk2 = HibernateProxy.class.getMethod("getHibernateLazyInitializer");
...

这个类也是在未命名模块中生成的。但这一次它工作了,没有抛出任何错误。无论如何,它可以访问java.lang.reflect,尽管包不应该被未命名的模块访问。

我看到的唯一区别是在bytebuddy生成的类中使用java.lang.reflect.Method合成字段。

所以,我的问题是,java模块系统不能与合成字段工作吗?

对不起,我的错。
事实证明,IllegalAccessError仅在实际调用安全包(java.lang)中的方法时抛出。反映(在我的例子中)在模块内,不能访问该包(在我的例子中是未命名的模块)。
如果只有对安全包的引用,则不会抛出异常。

在带有bytebuddy的示例中,在未命名模块中只有对Method类的引用。这个引用被传递给Interceptor类(它属于自动模块,在我的例子中可以访问java.lang.reflect),在那里实际调用Method。

所以,它与合成字段没有任何关系。