当Kotlin从Android Studio中的不同模块调用抽象Java代码的子类IllegalAccessError发生时

时间:2019-04-24 12:56:16

标签: java android kotlin

//module A in java

abstract class AbstractClass {
    public abstract void foo();
}

public class SubClass extends AbstractClass {
    @Override
    public void foo() {
        Log.v("x","-----------------");
    }
}

public class Invoker {
    public void visit(AbstractClass a){
        a.foo();
    }
}



//module B in kotlin

SubClass().foo()            // it works
Invoker().visit(SubClass()) // java.lang.IllegalAccessError occur

在AbstractClass前面添加public可以解决该问题,但是我不希望别人访问AbstractClass。还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

在Kotlin中,必须可以从using类访问所有类及其祖先。即使Java允许,从Kotlin调用此代码也会产生java.lang.IllegalAccessError。

如果您检查反编译的Kotlin字节码中有问题的调用,则会在Java中获得以下信息:

(new Invoker()).visit((AbstractClass)(new SubClass()));

有一个到AbstractClass的显式强制转换,这会导致错误,因为无法从调用代码中访问它。即使这种强制转换在Java中是不必要的,它还是由Kotlin在已编译的字节码中引入的,从而使此类调用失败。除了公开AbstractClass之外,别无他法。