注意:我对编程不太熟悉,希望你不介意我不正确地使用术语。 : - )
我正在尝试远程加载一个类。似乎该类被正确下载并启动,但是在调用其中一个方法时,我得到一个IllegalAccessError。这是我在本地做的,这100%没有错误。
(Parent) instance = (Parent)Class.forName("somepackage.ChildClass").newInstance();
instance.callSomeMethod();
这是我远程加载它的方法。这更具体地说明了IllegalAccessError “试图从类ChildClass访问字段Parent.field”
URLClassLoader classLoader = new URLClassLoader(new URL[] { new URL("http://mysite.com/classes/") });
(Parent) instance = (Parent)classLoader.loadClass("somepackage.ChildClass").newInstance();
instance.callSomeMethod();
另请注意,所有本地类都与远程/互联网类相同,我不想下载并将文件保存到我的类路径中。
答案 0 :(得分:0)
我认为如果你使用不同的类加载器,那么子类实际上可能不是父类的实例。因此,如果您在一个类加载器中加载了Parent,而在另一个类加载器中加载了Child,那么如果子类与其他类加载器中的父对象一起使用,则可能会导致您的问题。
请认为这个答案有点可疑,因为我不确定它是否适用于您的情况(查看失败的方法的详细信息以及无法访问的字段的声明会很有帮助)。
答案 1 :(得分:0)
当您的代码(某些方式)尝试访问某个字段或调用访问修饰符表示您无法执行的方法时,会发生IllegalAccessError。
通常,尝试执行此操作时会出现Java编译错误。但看起来你的“远程加载”正在围绕静态检查进行最终运行......
我可以想到两种可能的解释,但如果没有更多的信息,很难区分它们;例如实际代码和实际堆栈跟踪。
您可以远程加载与本地版本不同的类的版本,并且您尝试使用的方法/字段具有不同的访问权限。 (你不能以这种方式颠覆编译器的访问检查......这就是你真正想要做的事情。)
您可以在JVM中同时拥有该类的本地副本和远程副本。这里的问题是,从类型系统的角度来看,这两个版本将是不同的类。 (是的,两个不同的类具有相同的FQN,甚至可能是相同的代码。)这可能会导致访问问题。
我更倾向于认为这是第一个问题,因为我认为第二个问题会显示为IllegalAccessException
而不是IllegalAccessError
。