-1

我有一个A.java包含类的文件,该类A的方法aMethod()保存在 PC 上的文件夹中(不在包或工作区中)。

我有一个JFileChooser在另一个班级(GUI)。我希望能够选择类A并运行它,或者A::aMethod()使用JFileChooser.

这可能吗?

4

2 回答 2

0

您需要将类加载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方法来返回结果。在我的测试中,我只是转储了类类加载器引用。

第二个问题更难克服。你有两个基本的选择。

  1. 您可以定义一个对当前运行时和动态加载的类都可用的通用接口。这允许您将加载的类转换为某个已知接口,从而使您能够调用加载的类方法(因为您已经在两者之间建立了契约)
  2. 使用反射调用已加载类的方法。

我更喜欢第一个选项,但这确实意味着如果您更改接口,则需要重新编译双方。

于 2012-12-05T22:25:55.920 回答
0

所以我已经取得了一些进展。不是我想去的地方,但它很好......

我的 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(); 程序运行良好。

于 2012-12-06T16:28:56.973 回答