我正在尝试修改一些现有代码,以便我能够动态使用子类 将数据导入我的程序。但是我遇到了一个问题。我试图动态导入的一个类包含两个子类,它们访问抽象父类字段,导致java抛出IllegalAccessError。我写了一个小测试程序来演示我遇到的问题。
调用代码创建URL类加载器,加载类,然后调用do work方法:
URLClassLoader child = new URLClassLoader (urls, this.getClass().getClassLoader());
Class toLoad = Class.forName ("jarLoader.ChildClass", true, child);
SuperClass sc = (SuperClass) toLoad.newInstance();
sc.doWork();
Parent类包含3个int字段和一个抽象方法:
package jarLoader;
public abstract class SuperClass {
protected int a = 1;
protected int b = 2;
protected int c = 3;
public SuperClass(){
}
public abstract void doWork();
}
子类,当调用work时,它会创建内部类并尝试访问父数据feild并抛出异常: package jarLoader;
公共类ChildClass扩展了SuperClass {
@Override
public void doWork() {
NestedClass c = new NestedClass();
c.go();
}
class NestedClass{
private void go(){
int val = a;
System.out.println(val);
}
}
}
只有在将子类导出为jar并运行在运行时加载jar的程序后才会发生错误。
答案 0 :(得分:1)
https://en.wikibooks.org/wiki/Java_Programming/Keywords/protected
此关键字是一个访问修饰符,在方法或其他类成员之前用于表示方法或变量只能由驻留在其自己的类中的元素或同一包中的类访问(就像默认情况下一样)可见性级别)但是从其自己的类的子类开始,包括外部包中的子类(如果对表达式进行访问,其类型是此子类的类型)。
一旦你从jar加载它,它实际上扩展了父本的副本(从我的理解,即)。因此,它无法访问真实父母的受保护元素。您是否尝试过设置公开或创建公共getter?