2011-07-29 9 views
2

クラスXの名前が文字列に格納されている場合、同じプロジェクトではあるが別のパッケージの別のクラスからクラスXのメソッドを実行する方法はありますか?ディレクトリで.javaファイルをスキャンし、それらの名前をStringに格納します。実行時に文字列変数内の名前のみを調べるときにクラスを使用するにはどうすればよいですか?

例えば、私はクラス 'main'と 'method1'を持っています - 私のプログラムは、そのファイルからクラスAの名前をStringに取得します。それから、main関数またはmethod1関数を実行できるようにしたいのですが、そこに到達するための操作方法がわかりません。これは私が試したことですが、例外エラーが発生して、それが右のトラック、任意の提案?:

//gets the filename from JFileChooser method_fc 
File file = method_fc.getSelectedFile(); 

try { 
    Class c = Class.forName(file.getName()); 
    Method method = c.getDeclaredMethod("main"); 
    Object instance = c.newInstance(); 
    Object result = method.invoke(instance); 
} catch (Exception e) { 
    System.out.println("Cannot access class: "+e.getMessage()); 
} 
+3

提案1:だけではなく、「私は単に例外エラーが出る」、完全な例外を投稿してください。 –

+0

最初の推測:ファイル名から.javaまたは.classを削除してください... –

答えて

0

main通常String[]パラメータとstatic方法です。その場合、インスタンスは必要ありません。Classオブジェクト自体をターゲットオブジェクトとして使用します。

この断片は、標準main方法で動作します:

Class<?> c = Class.forName("com.company.SomeClass"); 
Method method = c.getDeclaredMethod("main", String[].class); 
method.invoke(c, (Object) new String[] {}); 
+0

ありがとうございます、これは私がやりたかったことに役立ちます。他の回答もありますので、すべての情報が私にどのように働いているのかがわかります - 指定しないと申し訳ありませんが、私のメインメソッドは静的で、String配列をパラメータとして受け取り、値を返しません – Alaph432

2

あなたはそれを行うが、クラス名は(あなたがそれを削除することができます)「の.java」または「.classファイル」で終わっていない考慮に入れることができます。

2

マイ推測は、あなたのmain方法がString[]パラメータを持っているということですが、あなたはそれを供給していない - またはそれは静的メソッドですが、あなたはインスタンスメソッドとしてそれを呼び出すようにしようとしています。

しかし、エラーメッセージであるまたはで見なくてもわかりにくいです。

フェルナンドは、クラスの名前はファイルの名前と同じではなく、ファイル名が ".class"で終わるだけでなく、パッケージ "Foo"も含まれている可能性があると指摘しています。 class "は実際には" com.acme.Foo "というクラスを含むかもしれません。

編集:コメントに記載されているように、クラスもクラスパス内にある必要があります。または特別なClassLoaderが必要になります。

+2

また、クラスがクラスパスにある必要があります。このコード例から、ユーザーはシステム上のクラスファイルを選択できます。 –

0

例外の完全なスタックを報告してください。

私の主な方法は、パラメータとして少なくとも文字列の配列を受け取ると思います。さらに、メインメソッドは通常voidとして定義されているため、結果を返さない。 なぜメソッド呼び出しにargsを渡さなかったのですか?

String[] args = new String[1] 
Object result = method.invoke(instance, args); 

少なくともメインメソッドの宣言を報告してください。

よろしく、

ルカ
関連する問題