【发布时间】:2017-11-01 21:58:02
【问题描述】:
编辑:感谢评论者试图复制!它开始看起来像是 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:类“myapp.Test$$Lambda$1”无法访问方法“void myapp.Test.()”(“myapp.Test$$Lambda$1”的声明出现在 /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)
有人有什么想法吗?
【问题讨论】:
-
可能是一个仅影响某些版本的错误。我刚刚尝试使用 jdk1.8.0_65 并没有抛出异常。
-
无法在 Eclipse Mars 中重现。
-
无法使用 IntelliJ 2017.2.5(和 Java 1.8.0_151)重现。
-
感谢您尝试重现人!你们中有人碰巧启用了multidex吗?我尝试了几个不同的 JDK,但没有结果
-
第二个应该可以正常工作,因为 lambda 将在类 escope 中执行,并且可以访问私有构造函数。第一个 if 被反射调用可能不起作用。
标签: java android android-multidex method-reference dexguard