add method reference support to asm parser
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user