28

javaでリフレクションによってカスタムジェネリックメソッドを呼び出す方法は?

class Person
{
  public <T> void print(T t)
   {
      System.out.println(t.toString());
   }
}
4

3 に答える 3

26

ジェネリックはコンパイル時に消去され、エラーを判断するためにコンパイラに追加情報を提供するだけです。ファイル内のメソッドのシグネチャを実際に変更するわけではありません.class

これは、Java で非ジェネリック メソッドを呼び出すのとまったく同じ方法で、Java でリフレクションによってジェネリック メソッドを呼び出すことを意味します。ただし、 の型を指定する代わりに の型をT指定しますObject

リフレクションによって通常のメソッドを呼び出す方法に関するチュートリアルが非常に多いため、さらに別のメソッドを追加するのをためらっています。ただし、リフレクションによってメソッドを呼び出す方法について本当に指示が必要な場合は、下にコメントを追加してください。必要なコードを追加します。

期待どおりに動作しない場合は、コンパイル済みのクラス ファイルをいつでも実行javapして、引数リストで正しいオブジェクトを使用していることを確認できます。<T extends List>型ジェネリック シグネチャを指定すると、結果のパラメーター オブジェクトが実際にはListオブジェクトになる可能性があります。

于 2012-05-24T14:22:38.750 に答える
16

これは私にとってはうまくいきます。

Method method = Person.class.getMethod("print", Object.class);

method.invoke(new Person(), "this is a string");
method.invoke(new Person(), 273);
method.invoke(new Person(), new Object());

印刷

this is a string
273
java.lang.Object@addbf1

もちろん、この背後にある理論は、@ Edwinの回答で美しく説明されています。

于 2012-05-24T14:21:44.413 に答える
5

ジェネリック型で extends を使用している Edwin の回答で与えられたポイントを強調するには、次のようなクラスがある場合

GenericHibernateDao<T extends Serializable>

、およびメソッド

public T save( T entity ) {};

リフレクションを使用してメソッド save を呼び出すには、Serializable クラスを使用する必要があります。つまり、以下を使用する必要があります。

Method method = GenericHibernateDao.class.getMethod(methodName, Serializable.class);

使用しているため、パラメータとして Object.class ではありません。

<T extends Serializable>
于 2014-05-08T08:43:03.107 に答える