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