diff --git a/README.md b/README.md index e914b12..c12c1c1 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,6 @@ - references to platform specific impls ## Asm -- method references - equals function for primitive and string + String::equalsIgnoreCase - equals function for registered primitive conversion types - IConst0Fixer: IConst0/1 on its own => false/true diff --git a/src/main/java/jef/asm/AsmParser.java b/src/main/java/jef/asm/AsmParser.java index 5c485c3..c142362 100644 --- a/src/main/java/jef/asm/AsmParser.java +++ b/src/main/java/jef/asm/AsmParser.java @@ -46,20 +46,17 @@ public class AsmParser { } private AsmParseResult parseLambdaExpression() throws Exception { - var cls = lambda.getClass(); + var cls = (Class) lambda.getClass(); var loader = cls.getClassLoader(); - InputStream is; - if (cls.getName().contains("$$Lambda$")) { - is = loader.getResourceAsStream(cls.getName().split("\\$\\$")[0].replace(".", "/") + ".class"); - } else { - is = loader.getResourceAsStream(cls.getName().replace(".", "/") + ".class"); - } var writeReplace = cls.getDeclaredMethod("writeReplace"); writeReplace.setAccessible(true); var serlambda = (SerializedLambda) writeReplace.invoke(lambda); Object[] args = IntStream.range(0, serlambda.getCapturedArgCount()).mapToObj(serlambda::getCapturedArg).toArray(); + var classname = serlambda.getImplClass(); var lambdaname = serlambda.getImplMethodName(); + cls = Class.forName(classname.replace("/", ".")); + var is = loader.getResourceAsStream(cls.getName().replace(".", "/") + ".class"); var cr = new ClassReader(is); var visiter = new FilterClassVisitor(Opcodes.ASM9, lambdaname, args); diff --git a/src/test/java/jef/asm/OptimizedAsmParserTest.java b/src/test/java/jef/asm/OptimizedAsmParserTest.java index eb20944..1cf53f0 100644 --- a/src/test/java/jef/asm/OptimizedAsmParserTest.java +++ b/src/test/java/jef/asm/OptimizedAsmParserTest.java @@ -159,6 +159,13 @@ public class OptimizedAsmParserTest { Assertions.assertEquals("`i` = 1337", act); } + @Test + public void testMethodReference() throws AsmParseException { + String act; + act = new OptimizedAsmParser((SerializablePredicate) TestClass::isB).parse().getExpression().toString(); + Assertions.assertEquals("`b`", act); + } + @Getter public static class TestClass extends SerializableObject { public int i = 1; @@ -166,5 +173,6 @@ public class OptimizedAsmParserTest { public double d; public float f; public long l; + public boolean b; } } \ No newline at end of file