2

我正在尝试修改一些现有代码,以便能够动态使用子类将数据导入我的程序。但是我遇到了一个问题。我试图动态导入的类之一包含两个子类,它们访问导致 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();

}

子类,当调用do work时,它会创建内部类并尝试访问父数据字段并抛出异常: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 的程序后才会发生该错误。

4

1 回答 1

1

https://en.wikibooks.org/wiki/Java_Programming/Keywords/protected

此关键字是访问修饰符,在方法或其他类成员之前使用,表示该方法或变量只能由位于其自己的类或同一包中的类中的元素访问(就像默认可见性级别一样)但此外来自其自己类的子类,包括外部包中的子类(如果访问是在表达式上进行的,其类型是该子类的类型)。

一旦你从 jar 中加载它,它实际上扩展了父级的副本(据我所知,就是这样)。因此它无法访问真正父级的受保护元素。您是否尝试过将 a 设置为 public 或创建公共 getter?

于 2015-09-23T05:53:44.617 回答