无法从不同 jar 中的同一包访问超类的受保护成员
我遇到了一个奇怪的问题,我无法弄清楚在尝试插件化我的程序时弹出的问题。另一个问题是我无法创建一个简单的测试用例,因为每次我尝试它都能正常工作。我一定错过了一些复杂情况。但我会尽量清楚地描述这种情况,以防万一它听起来很熟悉。
我有一个名为 Seed 的基类,它是主应用程序的一部分,由系统类加载器加载。我有一个插件,其中包含一个类Road,它是Seed的子类。它是在运行时从单独的 jar 文件加载的。类 Road 引用了 Seed.garden 字段,该字段定义为:
受保护的最终花园花园;
请注意,我没有收到编译错误。当插件jar包含在系统类路径中时,我也不会收到运行时错误。只有当我的主应用程序使用新的类加载器(以系统类加载器作为其父级)加载插件时,我才会收到错误。错误是:
java.lang.IllegalAccessError: 尝试访问字段包。Seed.garden from class package.路$4
这肯定与子类由与超类不同的类加载器加载的事实有关,但我找不到任何官方理由为什么这不应该起作用。另外,就像我说的,当我尝试用一个简单的测试用例(包括单独的jar,用不同的类加载器加载子类等)重现问题时,我不会得到错误。
我似乎也不太可能违反访问规则,因为当类由同一类加载器加载时,它可以工作,并且我不会收到编译错误。
我没有想法了!有没有人认识到这个问题,或者为我提供了一些方向的指针?帮助!