简体   繁体   中英

Compile java code at runtime

I have a java class that is used to perform login action using selenium. There are currently 10+ different login types and as such there is a lot of if else involved which looks bad and is not efficient.

Eg:

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();   
}
...........
...........

Other than code not being efficient the new code needs to be written, pushed and the server needs to be restarted every time a new login module is added.

I wanted to see if i can get the logic for login can be stored in db and if it can be compiled at runtime. I found groovy shell but i dont know how to get the results back to my class file. Also running groovy shell would require a lot of code changes. Is it possible in 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
}

I strongly advise against that approach. You are opening a door to bad code be injected in your application. Another way could be upload to your server your new jars and take advantage of class loader to load classes at runtime:

Also, you have alternatives to avoid if-else's: usage of interfaces and factory methods are the way to go, imho. And put your login's implementations on different classes implementing a Login interface, for example.

Factory method design pattern:

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM