Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行时编译java代码_Java_Groovyshell - Fatal编程技术网

在运行时编译java代码

在运行时编译java代码,java,groovyshell,Java,Groovyshell,我有一个java类,用于使用selenium执行登录操作。目前有10+种不同的登录类型,因此涉及到很多if-else,这些类型看起来很糟糕,效率不高 例如: 除了代码效率低下之外,每次添加新的登录模块时,都需要编写、推送新代码,并重新启动服务器 我想看看我是否可以得到登录的逻辑可以存储在db中,是否可以在运行时编译。我找到了GroovyShell,但我不知道如何将结果返回到我的类文件中。此外,运行GroovyShell还需要大量代码更改。在java中可能吗 public class Execut

我有一个java类,用于使用selenium执行登录操作。目前有10+种不同的登录类型,因此涉及到很多if-else,这些类型看起来很糟糕,效率不高

例如:

除了代码效率低下之外,每次添加新的登录模块时,都需要编写、推送新代码,并重新启动服务器

我想看看我是否可以得到登录的逻辑可以存储在db中,是否可以在运行时编译。我找到了GroovyShell,但我不知道如何将结果返回到我的类文件中。此外,运行GroovyShell还需要大量代码更改。在java中可能吗

public class ExecuteAuth implements Runnable{ 

    private WebDriver driver;

    driver = new FirefoxDriver(firefoxBinary, profile, cap);
    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    driver.manage().window().maximize();

    //MongoDB code
    DBCursor dbObjects = loginCollection.find();

    while (dbObjects.hasNext()) {
            DBObject dbObject = dbObjects.next();
            loginModule.add(new LoginModule((BasicDBObject) dbObject));

            String loginType = (String) dbObject.get("loginType")
            String script;
            if (loginType.equals("1")) {
                script = (String) dbObject.get("script")
            }   
    }

    GroovyShell shell = new GroovyShell ();

    shell.evaluate(script);

    RUN REST OF THE LOGIN LOGIC AFTER THE CODE IS EVALUATED
}

我强烈反对这种做法。您正在打开一扇大门,让坏代码被注入到您的应用程序中。另一种方法是将新JAR上载到服务器,并利用类加载器在运行时加载类:

此外,你还有其他选择可以避免if-else:imho,使用接口和工厂方法是最好的选择。例如,将您的登录实现放在实现登录接口的不同类上

工厂方法设计模式:


如果您要这样做,我会特别关注页面对象。只是想澄清一下:您想重新编译java程序的现有类,并在程序运行时重新加载它?为什么不让登录过程成为独立于应用程序其余部分的服务?然后,它可以独立于主应用程序进行修改和重新部署
public class ExecuteAuth implements Runnable{ 

    private WebDriver driver;

    driver = new FirefoxDriver(firefoxBinary, profile, cap);
    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    driver.manage().window().maximize();

    //MongoDB code
    DBCursor dbObjects = loginCollection.find();

    while (dbObjects.hasNext()) {
            DBObject dbObject = dbObjects.next();
            loginModule.add(new LoginModule((BasicDBObject) dbObject));

            String loginType = (String) dbObject.get("loginType")
            String script;
            if (loginType.equals("1")) {
                script = (String) dbObject.get("script")
            }   
    }

    GroovyShell shell = new GroovyShell ();

    shell.evaluate(script);

    RUN REST OF THE LOGIN LOGIC AFTER THE CODE IS EVALUATED
}