私はMethod
を受け取り、後で呼び出すためにそれを保存するAPIを持っています。それを呼び出すために私はsetAccessible(true)
をしなければならない。私がそれをする前に、私は守備的なコピーを作りたいと思っています。しかしどうですか?java.lang.reflect.Methodをコピーするにはどうしたらいいですか?
私は
method.getDeclaringClass()
.getDeclaredMethod(method.getName(), method.getParameterTypes());
考えるが、それは必ずしもバックブリッジ法(または2つの方法が同じ名前/パラメータの型が異なる戻り値の型を持つ他のケースの存在下で、私に同じ方法を与えることはありません)。
method.getDeclaringClass().getDeclaredMethod()
をループして正確に一致するものを探すことはできますが、それは効率が悪いようです。
守備のコピーがいいかもしれない理由を説明する例:
Method method = ...;
// Does setAccessible(true)
MyInvoker invoker = new MyInvoker(method);
// Sometime later, the user uses the same Method rather than re-retrieving it
method.setAccessible(true);
method.invoke(...);
method.setAccessible(false);
// Oops, now MyInvoker is broken
getDeclaredMethod()
は異なる方法を返す例:私にとって
interface Iface {
Object get();
}
class Impl implements Iface {
@Override
public String get() {
return "foo";
}
}
for (Method method : Impl.class.getDeclaredMethods()) {
System.out.println(method);
System.out.println(copy(method));
System.out.println();
}
private Method copy(Method method) {
try {
return method.getDeclaringClass()
.getDeclaredMethod(method.getName(), method.getParameterTypes());
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
}
、このプリントを:
public java.lang.String com.maluuba.api.Impl.get() public java.lang.String com.maluuba.api.Impl.get() public java.lang.Object com.maluuba.api.Impl.get() public java.lang.String com.maluuba.api.Impl.get()
は、なぜあなたは守備のコピーを作成したいですか? –
どのような条件の下で、方法は避けたい方法で変わるでしょうか? – hexafraction
@SotiriosDelimanolis:コンストラクタの引数を変更するのは、一般的には驚くべきことです。クライアントが後に 'setAccessible(false)'を呼び出す状況を避けるためです。 –