【发布时间】:2020-08-07 11:24:31
【问题描述】:
如何重新解析 java.util.function.Consumer 实例并检索其 lambda 表达式的参数和值(例如“student.person.surname”)。不久我想在运行时检索 lambda 表达式(消费者)作为文本。
import lombok.Data;
import java.util.function.Consumer;
public class ConsumerTest {
@Data
public static class Person{
private Integer id;
private String name;
private String surName;
}
@Data
public static class Student{
private Integer id;
private Person person;
}
public static void main(String args[])
{
Student student = new Student();
student.setId(1);
Person person = new Person();
person.setName("Ali");
person.setSurName("Veli");
person.setId(2);
student.setPerson(person);
Consumer<Student> displayLambda = s -> s.getPerson().setSurName("Gulsoy");
displayLambda.accept(student);
//I want to reparse displaylambda instance and print arguments.
//As here I must be able to retrieve "student.person.surname" and "Gulsoy"
}
}
【问题讨论】:
-
使用 lambda 表达式并不意味着 Java 突然带有反编译器。 Java 不是脚本语言。你有一个
Consumer<Student>的实现,仅此而已。 -
您的意思是“Consumer
displayLambda”实例不包含任何 lambda 表达式信息而不调用 accept 方法,我理解。当需要在运行时运行 lambda 函数时,它首先处理编译和解释的 ConsumerTest.main 方法,然后找到 displayLambda 行并执行 lambda 表达式。是真的吗?如果是这样,编译和解释后,除了使用访问类内容的方法之外别无他法。 -
不,当您运行
javac或您喜欢的工具的编译器以从.java文件中创建.class文件时,源代码将转换为字节码。这包括.java文件中的所有内容、所有类、方法和 lambda 表达式,并且发生在您运行编译后的代码之前。 -
感谢您的关注。有什么方法可以实现我想做的事情吗?
-
您的 cmets 对我帮助很大。但是,正如我发布的那样,我找到了另一种解决问题的方法。非常感谢。
标签: java lambda reflection java-8 consumer