Lambda and nested interface - cannot obfuscate
Java class file shrinker, optimizer, obfuscator, and preverifier
Brought to you by:
guardsquare
Hello,
I use Proguard v. 5.2.1, jdk 1.8.45 Windows 10 and Eclipse IDE.
Proguard fails when obfuscating lambda expression containing anonymous class.
There is simple workaround: change anonymous class to lamda
My 4 simple files:
/////NestedInterfaceTest.java
package proguard;
public class NestedInterfaceTest {
private IPrint1 iPrint;
public NestedInterfaceTest(IPrint1 iPrint) {
this.iPrint = iPrint;
}
public static void main(String[] args) {
NestedInterfaceTest nestedInterfaceTest = new NestedInterfaceTest(()->{
DataToPrint dataToPrint = new DataToPrint();
dataToPrint.setIPrint2(new IPrint2() {
@Override
public String convert(String s) {
return s.toUpperCase();
}
});
//
// this works:
//dataToPrint.setIPrint2(s->s.toUpperCase());
//
dataToPrint.setValue("aaaaaaaa");
System.out.println(dataToPrint.getValue());
});
nestedInterfaceTest.iPrint.printValue();
}
}
////DataToPrint.java
package proguard;
public class DataToPrint {
private String value;
private IPrint2 iPrint2;
public void setValue(String value) {
this.value = iPrint2.convert(value);
}
public void setIPrint2(IPrint2 iPrint2) {
this.iPrint2 = iPrint2;
}
public String getValue() {
return value;
}
}
////IPrint1.java
package proguard;
public interface IPrint1 {
public void printValue();
}
////IPrint2.java
package proguard;
public interface IPrint2 {
public String convert(String s);
}
Proguard output:
ProGuard, version 5.2.1
Reading program jar [C:\gxdevel\gx\proguard_test\nestedinterfacetest.jar]
Reading library jar [C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar]
Warning: proguard.NestedInterfaceTest$1: can't find enclosing method 'void lambda$1()' in program class proguard.NestedInterfaceTest
Warning: there were 1 unresolved references to program class members.
Your input classes appear to be inconsistent.
You may need to recompile the code.
(http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember)
Error: Please correct the above warnings first.
Thanks
Adam
This problem still happens in the latest release 5.3.2. I can reproduce it with a simple example:
Stream.of(1).map(i -> new Object() {}).forEach(o -> System.out.println(o));
which generates the error
Warning: <class name="">: can't find enclosing method 'java.lang.Object lambda$28(java.lang.Integer)' in program class ...</class>
This is common usage and should not cause any errors.
Thanks.