編集:解説しようとしているコメント者に感謝します!これはDexguardの問題であるように見え始めています。これはDexGuard integration in Android Studio 3.0に関連している可能性があります。メソッドプライベートコンストラクタへの参照はIllegalAccessErrorをスローします
オブジェクトのプライベートコンストラクタを同じ型のサプライヤへのメソッド参照として渡そうとすると、私は奇妙なエラーに遭遇します。 Test.supplier.get()
を起動しようとすると、私はクラッシュし、次のエラーを取得する
public class Test {
public static final Supplier<Test> supplier = Test::new;
private Test() {}
}
:私はそれを煮詰めることができた、これが唯一のコンストラクタのために起こるようですという
java.lang.IllegalAccessError: Method 'void myapp.Test.()' is inaccessible to class 'myapp.Test$$Lambda$1' (declaration of 'myapp.Test$$Lambda$1' appears in /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()
を呼び出すときに問題なく動作します。
一方、(() -> new Test()
代わりのTest::new
)もプライベートコンストラクタのためにクラッシュすることなく動作する代わりに、メソッド参照のラムダを使用して
誰もが任意のアイデアがありますか?
一部のバージョンにのみ影響するバグである可能性があります。私はちょうどjdk1.8.0_65を使ってみましたが、例外はスローされませんでした。 –
Eclipse Marsで再現できませんでした。 – shmosel
IntelliJ 2017.2.5(およびJava 1.8.0_151)で再現できませんでした。 – dave