Java 为什么远程加载类时会出现非法访问错误?

Java 为什么远程加载类时会出现非法访问错误?,java,Java,注意:我对编程不是很熟悉,希望您不要介意我对术语的错误使用。:-) 我正在尝试远程加载一个类。看起来这个类被正确下载和初始化了,但是当调用它的一个方法时,我得到了一个IllegaAccessError。这是我在本地做的,它100%工作,没有错误 (Parent) instance = (Parent)Class.forName("somepackage.ChildClass").newInstance(); instance.callSomeMethod(); 下面是我如何远程加载它。更具体地

注意:我对编程不是很熟悉,希望您不要介意我对术语的错误使用。:-)

我正在尝试远程加载一个类。看起来这个类被正确下载和初始化了,但是当调用它的一个方法时,我得到了一个IllegaAccessError。这是我在本地做的,它100%工作,没有错误

(Parent) instance = (Parent)Class.forName("somepackage.ChildClass").newInstance();
instance.callSomeMethod();
下面是我如何远程加载它。更具体地说,这会导致非法访问错误 “试图从类ChildClass访问字段Parent.field”


另外请注意,所有本地类都与远程/internet类相同,我不想下载文件并将其保存到我的类路径中

我认为如果您使用不同的类装入器,那么子类实际上可能不是父类的实例。因此,如果您在一个类加载器中加载了父类,在另一个类加载器中加载了子类,那么如果子类正在处理/处理来自另一个类加载器的父对象,则可能会导致问题


请考虑这个答案有点可疑,因为我不确定它是否适用于你的情况(这将有助于了解失败的方法的细节和无法访问的字段的声明)。

< An IllegalAccessError >发生在你的代码(一些)时。尝试访问一个字段或调用一个访问修饰符说您不能访问的方法

通常,在尝试执行此操作时会出现Java编译错误。但是,您的“远程加载”似乎正在围绕静态检查进行结束运行

我可以想出两种可能的解释,但如果没有更多的信息,很难区分它们;e、 g.实际代码和实际堆栈跟踪

  • 您可以远程加载与本地版本不同的类,并且您尝试使用的方法/字段具有不同的访问权限。(您不能以这种方式破坏编译器的访问检查……这才是您真正想要做的。)

  • 您的JVM中可能有该类的本地和远程副本。这里的问题是,从类型系统的角度来看,这两个版本将是不同的类。(是的,两个不同的类具有相同的FQN,甚至可能是相同的代码。)这可能会导致访问问题

我更倾向于认为这是第一个问题,因为我认为第二个问题会表现为
IllegalAccessException
,而不是
IllegalAccessError

URLClassLoader classLoader = new URLClassLoader(new URL[] { new URL("http://mysite.com/classes/") });
(Parent) instance = (Parent)classLoader.loadClass("somepackage.ChildClass").newInstance();
instance.callSomeMethod();