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