javaでリフレクションによってカスタムジェネリックメソッドを呼び出す方法は?
class Person
{
public <T> void print(T t)
{
System.out.println(t.toString());
}
}
javaでリフレクションによってカスタムジェネリックメソッドを呼び出す方法は?
class Person
{
public <T> void print(T t)
{
System.out.println(t.toString());
}
}
ジェネリックはコンパイル時に消去され、エラーを判断するためにコンパイラに追加情報を提供するだけです。ファイル内のメソッドのシグネチャを実際に変更するわけではありません.class
。
これは、Java で非ジェネリック メソッドを呼び出すのとまったく同じ方法で、Java でリフレクションによってジェネリック メソッドを呼び出すことを意味します。ただし、 の型を指定する代わりに の型をT
指定しますObject
。
リフレクションによって通常のメソッドを呼び出す方法に関するチュートリアルが非常に多いため、さらに別のメソッドを追加するのをためらっています。ただし、リフレクションによってメソッドを呼び出す方法について本当に指示が必要な場合は、下にコメントを追加してください。必要なコードを追加します。
期待どおりに動作しない場合は、コンパイル済みのクラス ファイルをいつでも実行javap
して、引数リストで正しいオブジェクトを使用していることを確認できます。<T extends List>
型ジェネリック シグネチャを指定すると、結果のパラメーター オブジェクトが実際にはList
オブジェクトになる可能性があります。
これは私にとってはうまくいきます。
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の回答で美しく説明されています。
ジェネリック型で 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>