dポイントプレゼントキャンペーン実施中!

リフレクションで、(1)の方のメソッドインスタンスを得たいとき、どういった方法が考えられますか?

//JDK 6.0

public Hoge {
void method1(String str, Object ...objs){}//(1)
void method1(String str, String str2){}//(2)
}

Hoge hoge = new Hoge();
Class c = hoge.getClass();
Method m12 = c.getMethod("method", String.class, String.class);
Method m11 = c.getMethod("method", ?? );

A 回答 (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 を調査すれば分かります。
    • good
    • 0

シンタックスシュガーのため↓で取得できますよ。


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]});
}
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!