如何将动态输入的用户表达式转换为 java 代码?
How to convert dynamically input user expression to java code?
我阅读了 byte buddy 和 javassist 文档,我想知道是否可以将字符串转换为:
get foos where name == toto
至
data.getFoos().stream()
.filter( f -> f.name.equals( "toto" ) )
.collect( Collectors.toSet() )
正则表达式可以将表达式捕获为:
final Pattern query = Pattern.compile("get (\w+) where (\w+) ([=!]+) (\w+)");
final Scanner scanner = new Scanner(System.in);
final Matcher matcher = query.matcher(input);
matcher.group(1) // foos -> Foo and foos -> getFoos()
matcher.group(2) // field to use as filter
matcher.group(3) // symbol == / !=
matcher.group(4) // thing to match
- 将
get foos
转换为 getFoos()
- 从
Foo
检查 class 如果 name
字段存在
- 如果字段
name
不是 Number.class
的实例,则将 ==
转换为 .equals
- 制作表达式
- 循环并打印结果
我看了一些例子,没能找到这样的东西。所以我来这里是为了得到你的光。谢谢
Byte Buddy 和 Javassist 都生成字节代码,而不是 Java 代码。然而,Javassist 确实具有将 String
包含的源代码从您的输入转换为字节代码的功能。但是,源代码级别为 Java 4 级别,因此您不能使用 lambda。
不过我想知道这是否是解决您的问题的正确方法。相反,我建议您以编程方式从参数中解析流。您可以通过创建自定义 aPI 将您的参数转换为相关流来扩大这一点。
我阅读了 byte buddy 和 javassist 文档,我想知道是否可以将字符串转换为:
get foos where name == toto
至
data.getFoos().stream()
.filter( f -> f.name.equals( "toto" ) )
.collect( Collectors.toSet() )
正则表达式可以将表达式捕获为:
final Pattern query = Pattern.compile("get (\w+) where (\w+) ([=!]+) (\w+)");
final Scanner scanner = new Scanner(System.in);
final Matcher matcher = query.matcher(input);
matcher.group(1) // foos -> Foo and foos -> getFoos()
matcher.group(2) // field to use as filter
matcher.group(3) // symbol == / !=
matcher.group(4) // thing to match
- 将
get foos
转换为getFoos()
- 从
Foo
检查 class 如果name
字段存在 - 如果字段
name
不是Number.class
的实例,则将==
转换为.equals
- 制作表达式
- 循环并打印结果
我看了一些例子,没能找到这样的东西。所以我来这里是为了得到你的光。谢谢
Byte Buddy 和 Javassist 都生成字节代码,而不是 Java 代码。然而,Javassist 确实具有将 String
包含的源代码从您的输入转换为字节代码的功能。但是,源代码级别为 Java 4 级别,因此您不能使用 lambda。
不过我想知道这是否是解决您的问题的正确方法。相反,我建议您以编程方式从参数中解析流。您可以通过创建自定义 aPI 将您的参数转换为相关流来扩大这一点。