Java报”IllegalAccessError”的原因如下:
在程序运行过程中,程序尝试访问不合适的类或方法,这种情况会导致Java虚拟机抛出”Illegal Access Error”异常。具体来说,这种异常可能会产生以下情况:
-
访问了不在同一个包中的protected方法或属性。
-
对private标记的类、方法或属性进行访问。
-
试图访问应该是final和static的方法和属性。
-
类和方法的修饰符不允许它们的访问。
解决”IllegalAccessError”需要我们做出以下操作:
-
检查代码中是否确实存在非法访问。可以使用”-verbose:class”参数查找非法访问。
-
查找Java类文件或jar文件版本不一致问题。当一个程序使用多个库或jar文件时,如果它们中的任何一个版本与当前目标版本不一致,则可能会发生非法访问异常。
-
检查Java安全文件。是否使用了Java安全文件(policy files)进行缺省的安全设置以授权类的访问。
接下来提供两个示例进行说明。
示例1:
我们在类A中访问另一个包下的类B的protected方法,代码如下:
package com.example.package1;
import com.example.package2.B;
public class A {
public void accessMethod() {
B b = new B();
b.protectedMethod();
}
}
发生了IllegalAccessError异常,我们需要将方法访问权限改为public,或者将类B的包级别改为相同的包。
示例2:
我们有一个final类MyClass,代码如下:
final public class MyClass {
public static void main(String[] args) {
doSomething();
}
private static void doSomething() {
System.out.println("Method executed.");
}
}
我们想重写doSomething方法,但是在其他类中,代码如下:
public class AnotherClass extends MyClass {
protected static void doSomething() {
System.out.println("New version executed.");
}
}
在运行时,将会抛出IllegalAccessError异常,的解决方法是将doSomething方法声明为final或private的,并将新方法放入新的类中。