1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/noear-liquor

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Evaluator demo

Инструмент оценки спиртных напитков основан на реализации компилятора Java. В режиме «перезапись кэша» производительность близка к исходному коду Java. Однако, когда существует «бесконечно много вариантов» выражений, кэш становится недействительным и генерируется бесконечное количество классов, после чего возникает ошибка OOM.

Рассмотрим инструмент оценки выражений:

  • Используйте «переменные» вместо констант, чтобы уменьшить компиляцию Exprs.eval(new CodeSpec("a+b+c"), context).
    • [рекомендация] эффекты, такие как отношения между классом и экземпляром;
  • используйте режим без кэширования Exprs.eval(new CodeSpec("1+2+3").cached(false)).
    • [Не рекомендуется].

1) Инструмент оценки выражений (можно написать только одну строку кода)

  • Должно быть возвращено какое-либо значение;
  • в выражении нет «;», «return» и «;» добавляются автоматически. Иначе убедитесь, что ваши операторы завершены;
  • для импорта классов, требуемых выражением, используйте CodeSpec::imports.
public class DemoApp {
    public static void main(String[] args) throws Exception {
        //Basics
        System.out.println(Exprs.eval("1+1"));

        //Advanced
        CodeSpec code1 = new CodeSpec("aa + 22").parameters(new ParamSpec("aa", Integer.class));
        System.out.println(Exprs.eval(code1, 1)); //=> 23

        Map<String, Object> context2 = new HashMap<>();
        context2.put("bb", 3);
        System.out.println(Exprs.eval("bb + 22", context2)); //=>25

        System.out.println(Exprs.eval(new CodeSpec("Math.min(1,2)").imports(Math.class))); //=>1
    }
}

2) Инструмент оценки скриптов

  • Можно импортировать классы или статические методы. Нет имени пакета;
  • внутренние классы используются без декораций («public», «static»). Поля и методы внутренних классов не поддерживают «static»;
  • используя CodeSpec::imports, можно импортировать классы или статические методы, необходимые для выражения. Или добавьте оператор «import» в свой код.
public class DemoApp {
    public static void main(String[] args) throws Exception {
        //Basics
        Scripts.eval("System.out.println(\"hello word\");");

        //Advanced (Don't add public if you have an inner class)
        CodeSpec code1 = new CodeSpec("import java.util.HashMap;\n\n"+
                "    class Demo {\n" +
                "      public String hello(String word) {\n" +
                "        return word;\n" +
                "      }\n" +
                "    }\n" +
                "\n" +
                "    Demo demo = new Demo();\n" +
                "    return demo.hello(name);") //name is an external parameter
                .parameters(new ParamSpec("name", String.class))
                .returnType(String.class);
        System.out.println(Scripts.eval(code1, "noear")); //=>noear
    }
}

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Java
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/noear-liquor.git
git@api.gitlife.ru:oschina-mirror/noear-liquor.git
oschina-mirror
noear-liquor
noear-liquor
main