2012-05-09 14 views
1

私のメソッドは、Methodオブジェクトをパラメータとして受け取ります。したがって、私はjava.lang.reflect.Methodのモックアップインスタンスを作成する必要があります。クラスはfinalであり、パブリックコンストラクタはありません。はい。だから...私は使うべき工場があるの? java.lang.reflect.ReflectAccessクラスはパッケージスコープで、私が探しているファクトリのようです(ただし、使用することはできません)。ここに何があるの?...?java.lang.reflect.Methodをどのようにインスタンス化しますか?

ええ、私はいつもClassのインスタンスを取得し、ランダムMethodを選ぶことができますが、はるかに賢明な方法があると思います...?

ありがとうございます!

答えて

3

ええと、私はいつもクラスのインスタンスを取得してランダムメソッドを選択できますが、はるかに賢明な方法があると思います...?

いいえ、そのです。他に意味をなさないものはありません。どのようなクラスの一部ではないメソッドを持つことを意味するだろうか?あなたがそれを呼び出すとどうなりますか?

これがテスト用の場合は、この目的のために特別な方法でクラスを作成することをお勧めします。

+0

実際に 'Method'のインスタンスを取得する方法がない場合、いくつかのテストメソッドでダミークラスをモックアップすることができますが、これは私が気にしていたものではありません。 – carlspring

+0

@ carlspring:あなたが念頭に置いたことは何ですか? 'Method.getDeclaringClass'はあなたが気にしていたことを何とか返すでしょうか? *そのメソッドを宣言しなかったクラス?実際の方法を使うよりも、どうすればいいのですか? –

+0

これは実際に役に立つ有用なケースがあると思います。たとえば、MethodExpressionを使用するコードとメソッドが必要なAPIをブリッジする場合などです。その場合、MethodExpressionの型情報に基づいてMethodインスタンスを動的に作成する必要があります。 Oracle JDKでMethodのソースを見ると、これは最終的な修飾子ではない場合はかなり簡単です。 –

1

メソッドは常にクラス(またはインスタンス)に関連しているので、そのクラスからメソッドを取得する方法は何ですか?

+0

私の(今更新された)質問で述べたように、私のメソッドは 'Method'を受け入れます。パラメータとして使用します。私はテストのためにいくつかの嘲笑された 'Method'-sを渡したいと思います。明らかに、 'Method'は常に' Class'と関連しています、あなたは明らかに正しいです。 – carlspring

+1

あなたはそれのためだけに模擬クラスを作成できませんか? – MByD

+0

もちろん、テスト用のダミークラスはいつでも作成できますが、これは私が心に留めていたものではなく、やや醜いもので直観的なものではありません。 – carlspring

2

トライは反射を使用します。

Constructor c = Method.class.getConstructor(Class.class, String.class, Class[].class, Class.class, Class[].class, int.class, int.class, String.class, byte[].class, byte[].class, byte[].class); 
c.setAccessible(true); 
c.newInstance(....); // send correct arguments 

これは動作するはずです。

+0

華麗な、私はこれを考えるべきだった! – carlspring

+0

これをテストした後、実際には機能しません。 NoSuchMethodErrorをスローしますが、残念ながら正しいです。 – carlspring

+0

これは、代わりに 'getDeclaredConstructor'を使うと動作します。 –

関連する問題