2016-04-29 14 views
0

私は、パラメータ(ファイル、環境変数、db ...基本的には何でも)に基づいてクラスを動的に拡張するためにJavaの 'extends'キーワードを置き換えることについて疑問に思っています。これは、クラスローダーやコンストラクターを使って遊ぶことでこれが実現しないためです。 「私は、インタフェースやスーパークラス階層を使用する必要があります」私はそれについての適切な説明は、単に古き良き相続専門用語がないので、JAVAでのボンネットの下に意味本当に拡張されているものではなく求めていないのです。Javaはプログラム的に拡張します

https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

+0

あなたはこのパラメータに基づいてクラスで何をしますか?異なるパラメータのクラスのインスタンスを複数持つことができないのはなぜですか? (短い答えは:いいえ、できません。継承はコンパイル時にクラスに焼いたプロパティです) –

+0

なぜそれをしたいのですか?これは動的プロキシのようなものですか? – Thilo

+0

@AndyTurnerが注釈を付けて反映している可能性がありますか? –

答えて

1

extendsキーワードを置き換える」唯一の方法は、実行時にクラスを動的に作成することです。これは完全に可能ですが簡単なことです。 Vert.xは、動的に生成されるクラスを広範囲に使用するプロジェクトの良い例です。

Javaはその意味で動的言語として設計されていませんでした。 JavaScriptのようないくつかの動的言語があります(そのうちのいくつかはJVM上で実行できます)。本当にあなたがDerived extends Baseを言うOOP、上の長い論文に入らなければ...ボンネットの下に

を意味する拡張されたものではなく

、それはDerivedがの公開と保護されたAPIの両方を継承することを意味Base(これを追加することができます)およびそのAPIの実装も含まれます。つまり、インスタンスを参照するコードでは、Derived "が" Base "であるため、Derivedインスタンスを受け入れることができます。このリンクはコンパイル時に作成されます。実行時にDerivedのインスタンスをインスタンス化するには、Baseインスタンスをインスタンス化する配管すべてに加えて、Derivedの配管を追加します。

+0

答えをありがとう、私はこのVert.xプロジェクトを調べます。 – Zoltan

0

あなたはJavaのような言語でそれを行うことはできません。 「継承」に関する情報は、コンパイラによって使用されるだけでなく、コンパイルされたバイトコードに「ハードベイク」されています。

本当にこのような種類の「動的な」メタプログラミングが必要な場合は、あなたがそうすることを可能にする言語を使用する方が良いです。そのような種類の使用を意図したことのない言語を「違反」するのではなく、

あなたは「スクリュー」と「ハンマー」を知っているからといって、愚かな比較をするには...壁にそれらのスクリューを入れるためにハンマーを使い始めないだろうか?代わりに、あなたはハンマーよりも "ねじ"でうまく動作するツールを探しています。

コードをJVM内で実行したい場合は、あなたはjythonやjrubyのような言語を考慮するかもしれません。

0

これを達成するには、条件に基づいてさまざまなバージョンのクラスを維持する必要があります。また、クラスローダーもカスタマイズする必要があります。特定のインスタンスをロードする必要があるときに、 JVMの起動時にデフォルトのクラスローダーによってロードされないクラス。

クラスの複数のバージョンを維持し、JVMが完全にその仕事をするようにする方が良いです。

関連する問題