选择并运行java类或在其他类(GUI)上使用JFileChooser调用类中的方法

时间:2012-12-03 22:09:49

标签: java jfilechooser

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

我在另一个班级JFileChooser上有GUI。 我希望能够选择课程A并运行它,或使用A::aMethod()致电JFileChooser

这可能吗?

2 个答案:

答案 0 :(得分:0)

您需要将类A加载到自定义类加载中,以便执行它。

这涉及到许多问题。第一个围绕包名称,第二个围绕实际调用类方法。

以下示例基本上使用URLClassLoader指向类的目录,这些类是布局我们在那里正确的包结构。本质上为自定义类加载器提供了它的类路径

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. 使用反射来调用已加载类的方法。
  3. 我更喜欢第一个选项,但它确实意味着如果您更改界面,则需要再次编译双方。

答案 1 :(得分:0)

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

我的GUI有一个按钮,可执行以下操作:

btnButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            runFAQm();
        }
    });

单击按钮时在GUI中调用的方法是runsFAQm()。方法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浏览器。我当然有太阳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时挂起。如果我注释掉//静态WebDriver driver = new FirefoxDriver();程序运行正常。