Как преобразовать динамически вводящее пользовательское выражение в код Java?

Я прочитал документацию по байтам и javassist, и я хотел бы не знать, возможно ли преобразовать строку, например:

get foos where name == toto

to

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, переведите == в .equals
  4. сделать выражение
  5. зациклить и распечатать результаты

Я прочитал несколько примеров, но не смог найти такую ​​​​вещь. Поэтому я пришел сюда, чтобы получить ваш свет. Благодарность


person bioinfornatics    schedule 06.07.2016    source источник


Ответы (1)


И Byte Buddy, и Javassist генерируют байтовый код, а не код Java. Однако у Javassist есть функциональные возможности для преобразования исходного кода, содержащегося в String, в байтовый код из ваших входных данных. Однако уровень исходного кода находится на уровне Java 4, поэтому вы не можете использовать лямбда-выражения.

Однако мне интересно, правильный ли это подход для вашей проблемы. Скорее, я бы предложил вам программно разрешить поток из аргументов. Вы можете усилить это, создав собственный API для преобразования ваших аргументов в рассматриваемый поток.

person Rafael Winterhalter    schedule 06.07.2016