add method reference support to asm parser

This commit is contained in:
wea_ondara
2022-09-12 18:48:14 +02:00
parent 4e75ce3b2e
commit 6870435eea
3 changed files with 12 additions and 8 deletions

View File

@@ -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);

View File

@@ -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>) 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;
}
}