2012-03-03 45 views
0

注意:我对编程不是很熟悉,我希望你不介意我对术语的不正确使用。 :-)为什么远程加载类时会出现IllegalAccessError?

我尝试远程加载类。看起来该类可以正确下载并启动,但在调用其中一个方法时会出现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

我认为,如果你使用不同的类加载器,然后子类实际上可能没有父母的一个实例。所以,如果你在一个类加载器中加载了Parent并且在另一个中加载了Child,那么如果子类与另一个类加载器的父对象一起工作,它可能会导致你的问题。

请考虑这个答案有些怀疑,因为我不确定它是否适用于您的情况(这将有助于查看失败的方法的详细信息以及无法访问的字段的声明) 。

0

的IllegalAccessError发生在你的代码(一些如何)试图访问一个字段或调用访问修饰符说你不能这样做的方法。

通常情况下,当您尝试做到这一点得到了Java编译错误。但现在看来,你的“远程加载”是做围绕静态检查结束运行...

我能想到的两种可能的解释,但它是很难分辨他们没有更多的信息;例如实际代码和实际踪迹。

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

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

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

相关问题