2011-10-30 14 views
1

継承クラスのリフレクションはどのように機能しますか?私のスーパークラスのコンストラクタではメソッドが反映されていないようです。リフレクション、継承、およびJava

「動物」のサブクラス「馬」がある場合、「動物」スーパークラスのコンストラクタにあるときに反射を使用して「馬」のメソッドにアクセスできますか?そうではありません。

+1

を埋め込むことでしょう。あなたは何を言うのですか?「それは見えません」 Reflection APIを使用して、 'Horse'クラスをロードし、新しいインスタンスを作成し、そのメソッドを呼び出します。しかし、なぜこのようなアプローチが必要なのか、もう少し私たちに教えてください。 – Bhaskar

+0

"setAccessible'を呼び出さずに指定するといいかもしれませんが、' setAccessible'を使わないでフィールドや非公開メソッドにリフレクションを使う点はあまりありません –

答えて

6

SuperClassコンストラクタは、常に子クラスの前に実行されます。したがって、子クラスのインスタンスは、それ自体として使用する準備ができた状態に決してなりません。

+2

+1:良い点です。これらのメソッドが使用可能な状態になるようにしてください。 –

+1

@saury、実際には、現在のスーパークラス*に関連付けられたサブクラス*のインスタンスは、スーパークラスのctrで呼び出される準備ができていませんが、 – Bhaskar

1

馬のインスタンスを持っている場合は、そのインスタンスのすべてのメソッド/フィールドにアクセスすることができます(Animalコンストラクタを含む)。

しかし、あなたがプレーンなAnimalまたは他のサブクラスにいる場合、Horseのメソッド/フィールドにアクセスすることはできません。

+0

私はOPが何かを求めていると思います:サブクラスのctr /メソッドは、Reflection *を使ってスーパークラスctrから呼び出すことができますか? – Bhaskar

2

動物のコンストラクタ本体がコンストラクタウマの本体の前に呼び出されるため、これは不可能ですか?オブジェクトの馬の部分はまだ存在しません。

2

スーパークラスのctor(またはその他のもの)は、サブクラス固有のメソッドにアクセスすべきではありません。スーパークラスはそれから派生するクラスについて何も知ってはいけません。

スーパークラスは、オブジェクトがまだ初期化されていないため、そのサブクラスで定義されたメソッドを呼び出さないでください。 Here's some discussion regarding that, with examples.

1

はい、いいえ。リフレクションAPIを使用すると、コンストラクタ内にある場合、サブクラス(または任意のクラス)のメソッドにアクセスできます。良い練習の面では、動物は馬ではないからです。

+0

本当に...スーパークラスのコンストラクタ内でサブクラスのインスタンスを知らなくても? – jayunit100

+0

anothのメソッドにアクセスするクラスは既存のインスタンスから独立しています。 Class.getMethodメソッドまたはClass.getMethodsメソッドを使用して、クラスのメソッドを取得できます。メソッドを取得したら、この参照をobj引数としてコンストラクタを使用してMethod.invokeメソッドで呼び出すことができます。これはほぼ確実に間違っていますが、実行可能であり、例外がスローされる可能性があります。 –

1

実現する重要なことは、Javaがクラスをロードする方法です。まず、スーパークラスがロードされ、次にサブクラスがロードされます。

サブクラス固有のメソッドにアクセスする必要がある場合は、別の方法論を見つける必要があります。

1つの戦略は、例えば、あなたのサブクラスがインターフェイスまたは継承を使用してスーパークラスで充実している契約の一部....

そうすることができます
関連する問題