如何将字符串转换为 Java 中的可运行代码
How To Convert String To Runnable Code In Java
我将 Java 代码作为字符串存储在数据库中。例如:
String x = "System.out.println(\"X\")";
我需要在任务执行器服务中将其转换为 java.lang.Runnable
到 运行。如何创建它?
private Runnable StringToRunnable(String task){
Runnable runnable = null;
return runnable;
}
Janino 是按需编译器的流行选择。许多开源项目都在使用它。
用法很简单。代码
import org.codehaus.janino.ScriptEvaluator;
public class App {
public static void main(String[] args) throws Exception {
String x = "System.out.println(\"X\");"; //<-- dont forget the ; in the string here
ScriptEvaluator se = new ScriptEvaluator();
se.cook(x);
se.evaluate(new Object[0]);
}
}
打印 x
.
正如其他人已经指出的那样,从数据库加载代码并执行它可能有点冒险。
我创建了这个方法
private void getMethod(String fromClass, String fromMethod) {
Class<?> aClass;
try {
aClass = Class.forName(fromClass);
Method method = aClass.getMethod(fromMethod);
method.setAccessible(true);
method.invoke(aClass.newInstance());
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException e) {
e.printStackTrace();
}
}
并由
调用
Runnable task = () -> getMethod(fromClass, fromMethod);
然后我将类名和方法名放入数据库中:
this.getClass().getCanonicalName() and string method name
我将 Java 代码作为字符串存储在数据库中。例如:
String x = "System.out.println(\"X\")";
我需要在任务执行器服务中将其转换为 java.lang.Runnable
到 运行。如何创建它?
private Runnable StringToRunnable(String task){
Runnable runnable = null;
return runnable;
}
Janino 是按需编译器的流行选择。许多开源项目都在使用它。
用法很简单。代码
import org.codehaus.janino.ScriptEvaluator;
public class App {
public static void main(String[] args) throws Exception {
String x = "System.out.println(\"X\");"; //<-- dont forget the ; in the string here
ScriptEvaluator se = new ScriptEvaluator();
se.cook(x);
se.evaluate(new Object[0]);
}
}
打印 x
.
正如其他人已经指出的那样,从数据库加载代码并执行它可能有点冒险。
我创建了这个方法
private void getMethod(String fromClass, String fromMethod) {
Class<?> aClass;
try {
aClass = Class.forName(fromClass);
Method method = aClass.getMethod(fromMethod);
method.setAccessible(true);
method.invoke(aClass.newInstance());
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException e) {
e.printStackTrace();
}
}
并由
调用 Runnable task = () -> getMethod(fromClass, fromMethod);
然后我将类名和方法名放入数据库中:
this.getClass().getCanonicalName() and string method name