Может ли ScriptEngineManager дать мне имя функции Javascript, которую он только что скомпилировал в Java
Как мне узнать имя функции JavaScript, проанализированной в Java? Я разрешаю пользователю ввести функцию Javascript (в JTextArea), затем я использую ScriptEngineManager, чтобы подтвердить, что это допустимый синтаксис следующим образом:
public final boolean isFunctionValid(String function)
{
try
{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
Object result = engine.eval(function);
}
catch(ScriptException se)
{
return false;
}
return true;
}
Работает нормально, но я также хочу знать имя функции, чтобы я мог назначить функции имя, соответствующее имени функции. Я бы предпочел, чтобы ScriptEngineManager сделал это для меня, а не для того, чтобы я пытался разобраться, анализируя функцию переменной со всеми присущими этому подходу рисками.
РЕДАКТИРОВАТЬ Поскольку кажется, что нет способа сделать это правильно, я создал две проверки, используя регулярные выражения, которые работают для меня.
protected static Pattern functionNameMatch;
protected static Pattern multipleFunctionsMatch;
static
{
functionNameMatch = Pattern.compile("function[ ]+([a-zA-Z0-9]*)[ ]*\\(");
multipleFunctionsMatch = Pattern.compile("function[ ]+");
}
protected boolean isOneFunction()
{
Matcher m = multipleFunctionsMatch.matcher(function.getText());
if(m.find())
{
if(m.find())
{
return false;
}
return true;
}
return false;
}
protected String deriveNameFromFunction()
{
Matcher m = functionNameMatch.matcher(function.getText());
if(m.find())
{
return m.group(1);
}
return "";
}
1 ответ
Так как это было невозможно в JavaScript, я делаю некоторые дополнительные проверки, используя сопоставление с шаблоном
protected static Pattern functionNameMatch;
protected static Pattern multipleFunctionsMatch;
static
{
//TODO this method only works if all parameters are put on first line of function, otherwise declares function
//is invalid
functionNameMatch = Pattern.compile("function[ ]+([a-zA-Z0-9]*[ ]*\\(.*\\))");
multipleFunctionsMatch = Pattern.compile("function[ ]+");
}
protected boolean isOneFunction()
{
Matcher m = multipleFunctionsMatch.matcher(function.getText());
if(m.find())
{
if(m.find())
{
return false;
}
return true;
}
return false;
}
protected String deriveNameFromFunction()
{
Matcher m = functionNameMatch.matcher(function.getText());
if(m.find())
{
return m.group(1);
}
return "";
}