2017-11-01 17 views
0

편집 : 주석 작성자가 재 작성을 시도해 주셔서 감사합니다! 이것이 덱스 가드의 문제인 것처럼 보입니다. 이 내용은 DexGuard integration in Android Studio 3.0과 관련이 있습니다.메서드 전용 생성자에 대한 참조가 IllegalAccessError를 throw합니다.

그래서 같은 형식의 공급자에 대한 메서드 참조로 개체의 개인 생성자를 전달하려고 할 때 이상한 오류가 발생합니다.

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

나는 충돌을 얻을 Test.supplier.get()를 불러들이려고하는데 다음과 같은 오류 때 : 이것은 단지 생성자를 위해 일어날 것 같다

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의) 개인 생성자에 대한 충돌없이 작동?

+0

일부 버전에만 영향을 미치는 버그 일 수 있습니다. 방금 jdk1.8.0_65를 사용하여 시도했지만 예외가 발생하지 않았습니다. –

+0

Eclipse Mars에서 재현 할 수 없습니다. – shmosel

+0

IntelliJ 2017.2.5 및 Java 1.8.0_151에서 재현 할 수 없습니다. – dave

답변

0

버그 일 가능성이 높습니다. [email protected]에 신고하십시오. 매우 빠르게 수정할 수 있습니다.

+0

다음 버전의 DexGuard 8.1.08에 대한 수정 사항이 포함될 것입니다. –