方法对私有构造函数的引用会抛出IllegalAccessError

时间:2017-11-01 21:58:03

标签: java android multidex method-reference dexguard

编辑:感谢评论者试图重新制作!它开始看起来像Dexguard特别是这个问题。这可能与DexGuard integration in Android Studio 3.0有关。

因此,当尝试将对象的私有构造函数作为方法引用传递给相同类型的供应商时,我遇到了一个奇怪的错误。我把它归结为:

public class Test {    
    public static final Supplier<Test> supplier = Test::new;
    private Test() {}
}

尝试调用Test.supplier.get()时,我遇到了崩溃并出现以下错误:

  

java.lang.IllegalAccessError:Method&#39; void myapp.Test。()&#39;上课&#39; myapp.Test $$ Lambda $ 1&#39; (声明&#39; myapp.Test $$ Lambda $ 1&#39;出现在/data/app/myapp-1/base.apk:classes2.dex)

请注意,构造函数似乎只会发生这种情况:按预期方式执行以下操作。

public class Test {
    public final Supplier<String> stringSupplier = this::buildString;
    private String buildString() { return "hi!"; }
}
从课堂外调用new Test().stringSupplier.get()时,

工作正常。

同时,使用lambda而不是方法引用也可以在没有崩溃的情况下使用私有构造函数(() -> new Test()而不是Test::new

有人有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这很可能是一个错误,请将其报告给support@guardsquare.com并且可以很快修复。