我有一个A.java
包含类的文件,该类A
的方法aMethod()
保存在 PC 上的文件夹中(不在包或工作区中)。
我有一个JFileChooser
在另一个班级(GUI
)。我希望能够选择类A
并运行它,或者A::aMethod()
使用JFileChooser
.
这可能吗?
我有一个A.java
包含类的文件,该类A
的方法aMethod()
保存在 PC 上的文件夹中(不在包或工作区中)。
我有一个JFileChooser
在另一个班级(GUI
)。我希望能够选择类A
并运行它,或者A::aMethod()
使用JFileChooser
.
这可能吗?
您需要将类加载A
到自定义类加载中,以便执行它。
这涉及到许多问题。第一个围绕包名称,第二个围绕实际调用类方法。
下面的例子基本上使用 aURLClassLoader
来指向一个类目录,这些类被布局在我们那里正确的包结构中。本质上为自定义类加载器提供了它的类路径
try {
URLClassLoader classLoader = new URLClassLoader(new URL[] {new File("path/to/classes/").toURI().toURL()});
Class<?> loadClass = classLoader.loadClass("dynamicclasses.TestClass");
Object newInstance = loadClass.newInstance();
System.out.println(newInstance);
} catch (Exception ex) {
ex.printStackTrace();
}
该示例还依赖于加载的类toString
方法来返回结果。在我的测试中,我只是转储了类类加载器引用。
第二个问题更难克服。你有两个基本的选择。
我更喜欢第一个选项,但这确实意味着如果您更改接口,则需要重新编译双方。
所以我已经取得了一些进展。不是我想去的地方,但它很好......
我的 GUI 有一个按钮,可以执行以下操作:
btnButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
runFAQm();
}
});
单击按钮时在 GUI 中调用的方法是 runFAQm()。方法 runFAQm() 使用 Runtime 运行保存在其他目录中的 java 文件。
public static void runFAQm(){
try {
String[] cmdArray = new String[2];
// first argument is the program we want to open
cmdArray[0] = "java";
// second argument is a txt file we want to open with notepad
cmdArray[1] = "FAQm";
// print a message
// create a file which contains the directory of the file needed
File dir = new File(
"c:/Documents and Settings/AESENG/My Documents/MK/Selenium_Practice/workspace/TestCDM/src");
// create a process and execute cmdArray and currect environment
Process p = Runtime.getRuntime().exec(cmdArray, null, dir);
BufferedReader in = new BufferedReader(new InputStreamReader(
p.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
textArea.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
通过 runFAQm() 方法中的 runtime() 运行的 java 文件(称为 FAQm.java)启动 Firefox 浏览器。当然我有sun Javac。
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import static org.junit.Assert.*;
import org.openqa.selenium.*;
public class FAQm {
static WebDriver driver = new FirefoxDriver();
public static void main(String[] args) throws Exception {
System.out.print("inside FAQm main" );
}
我现在的问题是我可以从命令行和 eclipse 运行 Class FAQm,但是当我通过单击按钮从 GUI 运行它时它挂起。它仅在启动 Webdriver 时挂起。如果我注释掉 //static WebDriver driver = new FirefoxDriver(); 程序运行良好。