4

javaからクラスのメソッドを動的に呼び出すことは可能ですか?

たとえば、クラスへの参照があるとしましょう。たとえば、文字列「com.foo.Bar」、またはcom.foo.Bar.classその他の必要なもの..)。そして、文字列の配列/リストがあります[First, Last, Email]

この配列を単純にループし'validate' + elementて、参照しているクラスのメソッドを呼び出したいと思います。例えば:

MyInterface item = //instantiate the com.foo.Bar class here somehow, I'm not sure how.

item.validateFirst();
item.validateLast();
item.validateEmail();

上記のコード行が動的に発生するようにしたいので、別のクラスへの参照を変更でき、文字列リストの名前は変更できますvalidate + nameが、参照があるクラスのメソッドを呼び出します。

それは可能ですか?

4

6 に答える 6

5

このようなものを書くことができます...それはクラスの名前を引数として文字列として取り、メソッド名とその引数を取ります

private static String invoke(String aClass, String aMethod, Class<?>[] params,
            Object[] args) throws Exception {
        String resp = "";
        Class<?> c = Class.forName(aClass);
        Method m = c.getDeclaredMethod(aMethod, params);
        Object i = c.newInstance();
        resp = m.invoke(i, args).toString();

        return resp;
}

リフレクションに関するOracleチュートリアルも参照できます...メソッドを呼び出す方法を示しています http://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html

于 2013-09-13T05:21:34.710 に答える
2

リフレクションを使用して可能です。

  1. まず、FQN (パッケージを含むクラス名である完全修飾名) から新しいクラスを作成します。

  2. 次に、アイテムを反復処理して、アイテムのメソッドelementsを呼び出します。"validate"

    Class<?> clazz = Class.forName("com.foo.Bar");
    Object item = clazz.newInstance(); 
    for (String element : elements) {
        Method method = clazz.getDeclaredMethod("validate" + element);
        method.invoke(item);
    }
于 2013-09-13T05:21:09.903 に答える
1

リフレクションを使用することもできますが、私のお気に入りの方法は beanutils を使用することです。

Bar b1 = //...
BeanUtils.getProperty(b1, "first");
BeanUtils.getProperty(b1, "last");

クラスは javabean 規則に準拠する必要があることに注意してください。beanutils の詳細については、このブログ投稿を参照してください(免責事項: 私はブログの著者です)。

于 2013-09-13T05:23:24.670 に答える
1

クラスの名前が事前にわかっている場合は、Class.forName(yourClassname) その方法を使用して、クラスを呼び出してから、そのメソッドを呼び出すことができます。

于 2013-09-13T05:23:38.627 に答える
0

はい、リフレクションを使用します。オブジェクトでClass.getDeclaredMethodを使用する

Object validator = <your object instance>;
final String[] values = {
  "Item1","Item2","Item3"
}
for(final String s : values) {
  Method m = validator.getDeclaredMethod("validate" + s,String.class);
  try {
    Object result = m.invoke(validator, s);
  }
  catch(ex) {}
}
于 2013-09-13T05:25:03.947 に答える