-1

PC のフォルダー (パッケージまたはワークスペース内ではない) に保存されているメソッドをA.java含むクラスを含むファイルがあります。AaMethod()

私はJFileChooser別のクラス ( GUI) を持っています。クラスを選択Aして実行したりA::aMethod()JFileChooser.

これは可能ですか?

4

2 に答える 2

0

Aクラスを実行できるように、クラスをカスタム クラス ロードにロードする必要があります。

これには多くの問題が関係しています。1 つ目はパッケージ名を中心に展開し、2 つ目は実際にクラス メソッドを呼び出すことを中心に展開します。

次の例では、基本的URLClassLoaderにクラスのディレクトリを指すために a を使用しています。これらのクラスは、正しいパッケージ構造にレイアウトされています。基本的に、カスタム クラス ローダーにそのクラス パスを提供します。

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

この例では、loaded classestoStringメソッドを使用して結果を返しています。私のテストでは、単純にクラス クラス ローダー参照をダンプしました。

2 番目の問題は、克服するのが少し難しいです。2 つの基本的な選択肢があります。

  1. 現在のランタイムと動的に読み込まれるクラスの両方で使用できる共通のインターフェイスを定義できます。これにより、ロードされたクラスを既知のインターフェイスにキャストできます。これにより、ロードされたクラスのメソッドを呼び出すことができます (2 つの間のコントラクトが確立されているため)。
  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 に答える