如何在Java中将字符串转换为可运行代码

如何在Java中将字符串转换为可运行代码,java,runnable,Java,Runnable,我将Java代码作为字符串存储在数据库中。例如: String x=“System.out.println(\“x\”) 我需要将其转换为java.lang.Runnable,以便在任务执行器服务中运行它。如何创建它 private Runnable StringToRunnable(String task){ Runnable runnable = null; return runnable; } 是按需编译器的常用选择。许多开源项目都在使用它 用法是直截了当的。代码 import org

我将Java代码作为字符串存储在数据库中。例如:

String x=“System.out.println(\“x\”)

我需要将其转换为
java.lang.Runnable
,以便在任务执行器服务中运行它。如何创建它

private Runnable StringToRunnable(String task){
Runnable runnable = null;

return runnable;
}
是按需编译器的常用选择。许多开源项目都在使用它

用法是直截了当的。代码

import org.codehaus.janino.ScriptEvaluator;
公共类应用程序{
公共静态void main(字符串[]args)引发异常{
String x=“System.out.println(\“x\”);/是随需应变编译器的常用选择。许多开源项目都在使用它

用法是直截了当的

import org.codehaus.janino.ScriptEvaluator;
公共类应用程序{
公共静态void main(字符串[]args)引发异常{
String x=“System.out.println(\“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();
    }
}
我通过以下方式将类名和方法名放入数据库:

这个.getClass().getCanonicalName()和字符串方法名

我创建了这个方法

    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();
    }
}
我通过以下方式将类名和方法名放入数据库:

这个.getClass().getCanonicalName()和字符串方法名


在安全性和实现级别上,这是一个非常糟糕的想法。即使到了可能的程度——这将是相当困难的——我也不能强烈建议您不这样做。@SDJ我会的see@LouisWasserman但如何存储任务以在重新启动服务器后运行它?@LouisWasserman您能推荐一些想法吗?有很多方法,但是一个简单的方法是,您有一个可能要做的事情的列表,您只需存储其中一个的名称。存储字符串“printX”,并在程序中的某个地方,使用
if(stringFromDatabase.equals(“printX”){System.out.println(“X”)}
。在安全性和实现级别上,这是一个非常糟糕的想法。即使可能做到这一点——这相当困难——我也强烈建议您不要这样做。@SDJ我会的see@LouisWasserman但我如何存储任务以在重新启动服务器后运行它?@LouisWasserman您能推荐一些想法吗?很多w是的,但一个简单的方法是,您有一个可能要做的事情的列表,您只需存储其中一个的名称。存储字符串“printX”,然后在程序中的某个地方,使用
if(stringFromDatabase.equals(“printX”){System.out.println(“X”)}