gpt4 book ai didi

java - 是否可以在运行时检索 lambda 表达式

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:27:52 25 4
gpt4 key购买 nike

昨晚我在玩 Java8 Lambda,我想知道是否可以在运行时检索 Lambda 表达式。简而言之,据我所知,Lambda 表达式在运行时转换为(静态)方法,然后使用 InvokeDynamics 调用。

举个例子:

people.filter(person -> person.getAge() >= minAge);

哪里filter将是采用 Predicate<T> 的自定义方法作为参数。这里面filter方法,在这种情况下,我如何以与 Lambda 表达式 ( person -> person.getAge() >= minAge) 相似(或相同)的形式检索参数?

我尝试使用 ASM5_BETA 读取参数类的生成字节码,但我只能使用 ClassVisitor 和 MethodVisitor 来访问与 Lambda 表达式关联的方法。

public <T> List<T> filter(Filter<T> expression) {
try {
Class<? extends Filter> expressionClass = expression.getClass();
byte[] content = getClassContent(expressionClass);
ClassReader classReader = new ClassReader(content);
classReader.accept(new PredicateClassVisitor(), 0);
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}

private byte[] getClassContent(Class<? extends Filter> expressionClazz) throws
IOException {
InputStream stream = Thread.currentThread().getContextClassLoader()
.getResourceAsStream(getClassName(expressionClazz.getName()));
return IOUtils.toByteArray(stream);
}

private String getClassName(String expressionClazz) {
return expressionClazz.substring(0, expressionClazz.indexOf('$'))
.replace('.', '/') + ".class";
}

static class PredicateClassVisitor extends ClassVisitor {

public PredicateClassVisitor() {
super(Opcodes.ASM4);
}

@Override
public MethodVisitor visitMethod(int i, String s, String s2, String s3,
String[] strings) {
return new PredicateMethodVisitor();
}
}

static class PredicateMethodVisitor extends MethodVisitor {

public PredicateMethodVisitor() {
super(Opcodes.ASM4);
}

@Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
Object... bsmArgs) {
for (Object object : bsmArgs) {
System.out.println(" " + object.toString());
}
}
}

我不确定这是要遵循的正确路径,我想知道在 ASM 或 JDK8 中是否有更合适的工具可用于此目的。

感谢您的任何建议 ;-)最好的祝福,泽维尔

最佳答案

您已经知道 lambda 表达式通常被编译成合成方法,因此您已经知道要反编译哪些代码以获得 lambda 的源代码,或者,嗯,类似于原始代码的东西,甚至看起来完全不同的东西,具体取决于特定代码。

没有理由反编译 lambda 表达式比反编译任何其他 Java 表达式更容易。简单的表达式可能很容易恢复,尤其是当代码有调试信息时,复杂的表达式在反编译时很可能看起来不同,尤其是当编译器对代码进行优化时。

关于java - 是否可以在运行时检索 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20629068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com