如何将动态输入的用户表达式转换为java代码?

时间:2016-07-06 08:56:55

标签: javassist byte-buddy

我读了字节伙伴和javassist doc,我想不知道是否可以转换字符串,如:

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
  1. get foos转换为getFoos()
  2. 检查Foo班级是否存在name字段
  3. 如果字段name不是Number.class将[{1}}翻译为==
  4. 的实例
  5. 制作表达
  6. 循环和打印结果
  7. 我没有找到这样的东西就读了一些例子。所以我来这里是为了得到你的光明。感谢

1 个答案:

答案 0 :(得分:1)

Byte Buddy和Javassist都生成字节代码,而不是Java代码。但是,Javassist具有将String包含的源代码转换为输入的字节代码的功能。但是,源代码级别为Java 4级别,因此您无法使用lambdas。

但我想知道这是否是解决问题的正确方法。相反,我建议您以编程方式解析参数中的流。您可以通过创建自定义aPI将您的参数转换为相关流来扩大此范围。