• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:リフレクション 可変長引数メソッドの取得)

リフレクションで可変長引数メソッドを取得する方法

このQ&Aのポイント
  • リフレクションを使用して、可変長引数メソッドのインスタンスを取得する方法について教えてください。
  • JDK 6.0の場合、リフレクションを使用してメソッドインスタンスを取得する方法はありますか?
  • Hogeクラスのメソッド名がmethodで、引数の型がStringまたはString型の可変長引数のものを取得するためのリフレクションのメソッドを教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • nfonfonfo
  • ベストアンサー率63% (12/19)
回答No.2

No1.です、連投ですみません。 回答書いてる途中で、HogeクラスですでにObject配列がオーバーロードしている環境でObjectの可変長引数を定義したら、どうなるのか気になったので手元の環境で確認してみました。結論としては「先方の定義は有効で後方の定義部分で文法エラーが発生する。」みたいです。 ↓が確認したソース import java.lang.reflect.Method; public class Hoge { public Hoge() { } public void method1(String str, Object[] obj){ System.out.println("CC"); } //↓の部分ですでに定義されているという文法エラー public void method1(String str, Object ...objs){ System.out.println("AA"); } public void method1(String str, String str2){ System.out.println("BB"); } public static void main(String[] args) throws Exception{ Hoge hoge = new Hoge(); Class c = hoge.getClass(); Method m12 = c.getMethod("method1", String.class, String.class); Method m11 = c.getMethod("method1", String.class,Object[].class ); m11.invoke(hoge,new Object[]{"",new Object[0]}); } } 環境 NetBeans 5.0 で確認 あと最後にリフレクションでメソッドの呼び出し引数の型の定義方法が分からない場合はClass#getDeclaredMethodsで全てのメソッドを取得しての該当のメソッドの parameterTyps を調査すれば分かります。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • nfonfonfo
  • ベストアンサー率63% (12/19)
回答No.1

シンタックスシュガーのため↓で取得できますよ。 c.getMethod("method1", String.class,Object[].class); 下は質問文を変更したソースです。 public class Hoge { public Hoge() { } public void method1(String str, Object ...objs){ System.out.println("AA"); } public void method1(String str, String str2){ System.out.println("BB"); } public static void main(String[] args) throws Exception{ Hoge hoge = new Hoge(); Class c = hoge.getClass(); Method m12 = c.getMethod("method1", String.class, String.class); //アクセス修飾子がpublic以外の場合はgetDeclaredMethodで取得可能 Method m11 = c.getMethod("method1", String.class,Object[].class ); m11.invoke(hoge,new Object[]{"",new Object[0]}); } }

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • リフレクション Method.invoke() 時のインスタンス変数

    現在リフレクションAPIを使用してフレームワークを 使いやすく構築しようとしているのですが、 以下の例の抜粋コードで、一点わからないことがあります。 1:Object bean = beanField.get(action); 2:Class<?> beanClass = bean.getClass(); 3:Method validMethod = beanClass.getMethod("valid"); 4:if (void.class.equals(validMethod.getReturnType())) { 5: // void 型 6: validMethod.invoke(bean); 7:} 6行目の invoke() で bean クラスの valid メソッドを呼び出しています。この時点でデバッグしたところ、bean が保持しているインスタンス変数に値が正常に格納されているのですが、 実際に bean.valid() メソッド内にデバッグが進んだ時、bean 内のインスタンス変数が全て null となってしまっています。 invoke したメソッド(ここではvalid)内で、自分自身(bean)のインスタンス変数値を取得することはできないのでしょうか。 invoke の引数に bean を渡しているから、取れる気がするのですが、、 お分かりになればどうかご教示ください。 以上、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • リフレクション

    リフレクションによって、Stringの値(strVal)を各クラスのオブジェクトに変換したいと思っております。 下のようなコードで、this.typeにセットしてあるオブジェクトのvalueOfメソッドを実行したいのですが、clazz.getMethod部分で次のようなExceptionが発生してしまいます。 staticメソッドはgetMethodでは取得・実行できないのでしょうか? ご存知の方いらっしゃいましたら、教えて頂けないでしょうか。 【Exception】 java.lang.NoSuchMethodException: java.lang.String.valueOf() 【コード】 Class clazz = Class.forName(this.type); Method method = clazz.getMethod("valueOf", new Class[0]); return method.invoke(clazz.newInstance(), new Object[]{strVal} ); 今回、this.typeには、"java.lang.String"が入っています。

    • ベストアンサー
    • Java
  • ロックの取得とwaitメソッド

    インスタンスに対してwait()メソッドを実行するには、そのインスタンスのロックを取得していなくてはならないと思っています。 method2()がエラーになるのと、method3が正常に動作するのは、 インスタンスに対するロックの有無で理解できます。 ただ、下記のソースでmethod()がエラーとならない動作が理解でき ませんでした。 このメソッドだと、メソッド単位ではロックがかかっていますが、 synchronizedでないメソッドが存在すれば別スレッドからアクセスでき るので、インスタンスに対するロックを取得しているわけではないと思 います。 私の理解が間違っているのでしょうか。 class MyClass { String str = new String("a"); public synchronized void method(){ try{ wait(); } catch (Exception e) { e.printStackTrace(); } } public void method2(){ synchronized (str) { try{ wait(); }catch(Exception e){ e.printStackTrace(); } } } public void method3(){ synchronized (this) { try{ wait(); }catch(Exception e){ e.printStackTrace(); } } } } class UseMyThread1 { public static void main(String args[]) { MyClass mc1 = new MyClass(); MyClass mc2 = new MyClass(); MyClass mc3 = new MyClass(); //mc1.method();//ここはエラーにならない System.out.println("*********"); //mc2.method2(); //ここはエラーになる System.out.println("*********"); //mc3.method3();//ここはエラーにならない } }

    • ベストアンサー
    • Java
  • method#invoke のラッパ

    下記のようなリフレクション(動的なメソッド呼び出し)の汎用的なラッパ関数を作成しています。 class Wrapper { public static void main(String[] args) { Hoge hoge = new Hoge(); // (1) Wrapper.call(hoge, "testMethod", new Human()); // (2) これはNoSuchMethodException例外発生 Wrapper.call(hoge, "testMethod", new Japanese()); // (3) これもNoSuchMethodException Wrapper.call(hoge, "testMethod", (Human) new Japanese()); } public static Object call(Object obj, String method_name, Object ...args) { try { // 引数のクラス配列を取得 Class[] class_ary = new Class[args.length]; for (int i=0; i<args.length; i++) class_ary[i] = args[i].getClass(); Class c = obj.getClass(); // メソッドインスタンスを取得 Method method = c.getMethod(method_name, class_ary); // 実行 return method.invoke(obj, args); }catch (Exception e) { e.printStackTrace(); return null; } } } class Hoge { public void testMethod(Human h) { System.out.println(h.getClass()); } } class Human { } class Japanese extends Human { } 一見うまくうごくようにみえたのですが (2)のようにすると例外が発生することが最近わかりました。 親クラスにキャストした(3)でも同様です。 理由は // 引数のクラス配列を取得 Class[] class_ary = new Class[args.length];  for (int i=0; i<args.length; i++)   class_ary[i] = args[i].getClass(); のgetClass()の部分がキャストしようがしまいが Japaneseのクラスインスタンスを返すからだというのはわかっているのですが、他の方法が思いつきません。 多態性を備えたラッパ関数を作成することは無理でしょうか? 何か解決策があればアドバイスをお願いします。

    • ベストアンサー
    • Java
  • Java リフレクションについて

    1.リフレクションを使い、値をセット(BeanのSetterメソッドにて) 2.1でセットした値を取得するために、下記コードで取得 Method Method = Class.getMethod("getLstData"); Object obj = Method.invoke(****); 上記の****の箇所には、メソッドのあるクラスのインスタンスを渡す、 というところまでは分かりますが、newInstance()してしまうと、新しいオブジェクトになってしまうので 値が取得できません。 error>>java.lang.IllegalArgumentException: object is not an instance of declaring class どのようにすれば、値の取得が可能でしょうか。 どなたかご教授いただければと思います。 ※Java 1.5を使用

    • ベストアンサー
    • Java
  • VC++/MFCでリフレクション

    Javaでは、ObjectのgetClass()でClassクラスの インスタンスが取れ、実行時に指定した、メソッド名や、引数で、動的にメソッドを呼びだすようなリフレクション機能が使用できます。 同様のことをC#でも実装したことがあります。 VC++/MFCにて、このようなリフレクションをやるやり方を教えてください。 C++の標準あるいわ、MFCの機能など、どちらでもよいです。 メタクラス型のようなものを実行時に取得して、リフレクションする方法だと思います。 質問の内容はVC++.NETやVC++/CLIではないです。そちらのほうでのやり方は既に発見しました。

  • Javaでメソッドの引数にメソッド

    以下のようにメソッドの引数にメソッドを渡したいです。 static void methodA(methodB, str) { methodB(str); } static void methodB(str) { System.out.println(str); } つまりメソッドAにメソッド名「methodB」と文字列「str」を渡して、間接的にメソッドBを実行させたいということです。 getMethodやinvokeを使うのかなとは思ったのですが、よく理解できませんでした。 上記のようなことは可能でしょうか?

    • ベストアンサー
    • Java
  • リフレクション

    Webアプリ上でリフレクションにてとあるクラスのメソッドを実行するサンプルを作成して 見たのですがうまく動きませんでした。最後のmethod.invoke()の処理にてExceptionが発生し、 java.lang.IllegalArgumentException: object is not an instance of declaring class と表示されてしまいます。 作成したサンプルは下記なのですがどこが原因かお分かりになりますでしょうか。 try { Class cls = Class.forName("dao.TestDao"); // 引数の型をセット Constructor constructor = cls.getDeclaredConstructor(HttpSession.class); constructor.setAccessible(true); // 引数を渡してオブジェクトを生成 Object obj = constructor.newInstance(session); Method method = cls.getDeclaredMethod("getDataDao", int.class); method.setAccessible(true); Object result = method.invoke(cls, new Integer(100)); } catch (Exception e) { e.printStackTrace(); } // このクラスのgetDataDao()をリフレクションにて実行 public class TestDao { HttpSession session = null; public TestDao(HttpSession session) { this.session = session; } public List<String> getDataDao(int iNo) { List<String> list = new ArrayList<String>(); list.add((String)session.getAttribute("1")); list.add((String)session.getAttribute("2")); list.add((String)session.getAttribute("3")); list.add((String)session.getAttribute("4")); list.add((String)session.getAttribute("5")); return list; } }

    • ベストアンサー
    • Java
  • リフレクションでフィールドのインスタンス取得

    リフレクションを使ってフィールドの型やオブジェクトのタイプ、名前などは取得できるのですが、それ自身のインスタンスを取得できません。 ClassオブジェクトのnewInstanceでは、新しく作ってしまうのでだめでした。なにかよい方法はないでしょうか? class Parent{ Foo foo1,foo2; Bar bar; } というクラスでbarからfoo1,foo2のメソッドを呼び出したいのですが、 Fooは何個定義されるかわからない状態です。 Barないでリフレクションを使ってfoo1,foo2をあらわすClassやFieldは取得できるのですが、foo1,foo2自身が取得したいのです。 よろしくお願いします

    • ベストアンサー
    • Java
  • java のメソッドの使い方について

    現在のjavaの勉強しております。 そこでフィールドについてどうしてもわからないことがあったので質問させていただきます。 他クラスのメソッドを利用したい時、通常インスタンス化を行いますが、下記のようにフィールドに宣言しても、他クラスのメソッドを利用できることに疑問を感じました。 public class Test{ public String show(){     ~~   return null; } } //Testクラスのshowメソッドを呼び出します public class Test2{ private Test test_; public String triaezu(){    String str = test_.show(); ~~   … このようにフィールドにもつ呼び出しとインスタンス化をして呼び出す方式とは一体何が違うのでしょうか? プログラムの先輩方、基礎的なことすぎて申し訳ないのですが、どうかご教授ください。

    • ベストアンサー
    • Java