PC のフォルダー (パッケージまたはワークスペース内ではない) に保存されているメソッドをA.java
含むクラスを含むファイルがあります。A
aMethod()
私はJFileChooser
別のクラス ( GUI
) を持っています。クラスを選択A
して実行したりA::aMethod()
、JFileChooser
.
これは可能ですか?
PC のフォルダー (パッケージまたはワークスペース内ではない) に保存されているメソッドをA.java
含むクラスを含むファイルがあります。A
aMethod()
私はJFileChooser
別のクラス ( GUI
) を持っています。クラスを選択A
して実行したりA::aMethod()
、JFileChooser
.
これは可能ですか?
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 つの基本的な選択肢があります。
私は最初のオプションを好みますが、インターフェイスを変更した場合は、両側を再度コンパイルする必要があることを意味します。
それで、私はいくつかの進歩を遂げました。私がなりたい場所ではありませんが、それは良いことです...
私の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(); をコメントアウトすると、プログラムは正常に実行されます。