- PR -

変数(String型)の中にメソッド名が入ってるのですが、

投稿者投稿内容
かつや
ベテラン
会議室デビュー日: 2004/01/19
投稿数: 70
投稿日時: 2004-11-10 15:53
変数(String型)の中にメソッド名が入ってるのですが、
そのメソッドを実行する方法が思いつかないです。

public class aaa {
aaa() {}

public void test1(String method) {
// パラメータの「method」の中に”test2”が入っている
}

public test2() {
}
}
tak3
ベテラン
会議室デビュー日: 2004/04/15
投稿数: 80
お住まい・勤務地: 菜の花・銀杏
投稿日時: 2004-11-10 16:09
javaとリフレクションで検索すると望みのサンプルコードが見つけられると思います。

http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/reflect/package-summary.html
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-11-10 16:10
コンパイルもしてないですが。
コード:
 public void test1(String method) {
  Method m = this.getClass().getDeclaredMethod(method, new Class[]);
  m.invoke(this, new Object[]);
 }


Tak
会議室デビュー日: 2004/08/26
投稿数: 7
お住まい・勤務地: 東京
投稿日時: 2004-11-10 16:32
コンパイルを通るようにしてみました。
public void test1(String method) {
Method m = null;
try {
m = this.getClass().getDeclaredMethod(method, null);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
try {
m.invoke(this, null);
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (InvocationTargetException e1) {
e1.printStackTrace();
}
}
_________________
かつや
ベテラン
会議室デビュー日: 2004/01/19
投稿数: 70
投稿日時: 2004-11-11 13:21
Class#getDeclaredMethod と Method#invoke を使用すればいいんですね。
ありがとうございます。

でも、またつまずきました。
呼び出したいメソッドは、同じクラス内ではなく、
すでに別クラスAでインスタンス化されたクラスB内のメソッドです。

これって、呼び出せるのでしょうか?
あいつー
ベテラン
会議室デビュー日: 2004/05/20
投稿数: 89
投稿日時: 2004-11-11 13:57
あいつーです。

引用:

かつやさんの書き込み (2004-11-11 13:21) より:
Class#getDeclaredMethod と Method#invoke を使用すればいいんですね。
ありがとうございます。

でも、またつまずきました。
呼び出したいメソッドは、同じクラス内ではなく、
すでに別クラスAでインスタンス化されたクラスB内のメソッドです。

これって、呼び出せるのでしょうか?


質問の意図が図りかねるのですが、
他のクラスでインスタンス化したオブジェクトを使用したいと仰っていますか?
つまり、インスタンスへの参照をメソッドの引数として渡すのではなく、
JVMヒープから取得する、ということでしょうか。
かつや
ベテラン
会議室デビュー日: 2004/01/19
投稿数: 70
投稿日時: 2004-11-11 14:33
かつやです。
今回のシステム、リモート端末から「サーバ側のメソッド名」と「バイナリデータ」を受信するのですが、
サーバ側は、SwingのJavaアプリ(クラスA)が起動しており、受信用のスレッド(クラスB)も動いてます。

クラスBは、クラスAのメンバになります。
で、クラスB内で受信したメソッド名は、
クラスAのメソッドの場合もあれば、クラスA内のメンバクラスCのメソッドの場合もあります。

概略はこんな感じです。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-11-11 14:47
普通に、可能ですよ。

Class#getDeclaredMethod()をClassB.classから呼んで、呼び出したいMethodの
オブジェクトを取り出し、Method#invoke()の第一引数にClassBインスタンスへの
参照を渡せばオッケーですよ。

ClassBインスタンスへの参照が、その処理を書く位置から見えない位置にある場合は、
それは見えるようにプログラムを改造してくださいとしかいえませんが^^;

スキルアップ/キャリアアップ(JOB@IT)