在运行时编译java代码

时间:2017-05-15 20:57:26

标签: java groovyshell

我有一个java类,用于使用selenium执行登录操作。目前有10种以上不同的登录类型,因此有很多其他涉及的内容看起来很糟糕且效率不高。

例如:

if (logintype == 1 ) 
{
 driver.findElement(By.id("username")).clear();
                 driver.findElement(By.id("username")).sendKeys(username);
                 driver.findElement(By.id("password")).clear();
                 driver.findElement(By.id("password")).sendKeys(password);
                 driver.findElement(By.id("signin")).click();   
}
else if (logintype ==2 )  
{
 driver.findElement(By.id("username")).clear();
                 driver.findElement(By.id("username")).sendKeys(username);
                 driver.findElement(By.id("password")).clear();
                 driver.findElement(By.id("password")).sendKeys(password);
                 driver.findElement(By.id("signin")).click();   
}
...........
...........

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

我想知道我是否可以将登录逻辑存储在db中,如果可以在运行时编译。我发现groovy shell但我不知道如何将结果返回到我的类文件。运行groovy shell也需要进行大量的代码更改。是否有可能在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
}

1 个答案:

答案 0 :(得分:2)

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

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

工厂方法设计模式: