2011-07-29 21 views
10

javaで同じ名前とパッケージを持つ2つの異なるクラスをインポートして使用することはできますか?同じ名前で同じパッケージの2つのJavaクラスを使用できますか?

たとえば、「com.foo.Bar」という名前の2つのクラスがあり、それらは少し異なります。私は両方を使用できるようにしたいと思っていますが、名前とパッケージを同じに保つように強制する制約があります(愚かな反射的なものだからです)。

これらのクラスをインポートして分離するためのJavaの機能はありますか?

具体的には、アボロのスキーマを変更してはいけない(oops!)ように変更しましたが、今では私の前に戻って、私の読むことができない古いavroファイルを変更したいと思います。新しいスキーマで読むことができるファイルに新しいスキーマを追加します。 Avroは特定のクラスとパッケージ名を使用してファイルをロードするように強制しているようです。

+0

トップレベルタイプの名前が、同じパッケージに宣言されている他のトップレベルクラスまたはインターフェイスタイプの名前として表示されるのは、コンパイル時エラーです。 – roshan

答えて

5

いいえ、Javaパッケージは、この問題を避けるために正確に使用されています。

+1

私はラッパークラスの考えがうまくいかないと思います。 2つの同名のクラスをC1とC2とする。それらのそれぞれのラッパーW1およびW2に取り付けられている。クラスローダは(1)W1をロードし、(2)C1をロードさせます。次に、クラスローダーは(3)W2をロードします。すでにC2をロードしていると思うでしょう(同じ名前のため)。あなたのW2クラスはC1をラップします。 – emory

0

Javaには名前空間がありません。C#でしか使用できないため、パッケージを意味すると見なします。プロジェクトごとに1つの完全修飾名しか存在できません。

0

技術的には、バイトレベルコードの書き換えなどの低レベルトリッキーを使用して行うことができます。私は別のJava crypterを知っている限り/ encryptersはそのように動作する - 彼らが持っているあなたが本当に最も確実必見ような何かをした場合など

+0

これは低レベルである必要はありません。別々のクラスローダインスタンスは、移動する方法です。 – Mishax

0

A.class B.class C.classと呼ばれるクラスの多くこれは、異なるクラスローダーを使用したり、おそらくリフレクションを使用して達成できます。

これはJavaの仕組みではありません。目的に合ったものではありません。あなたのために愚かなことをするべきではありません。

6

はいあります。実行時に両方にアクセスできるように、独自のClassloaderを実装し、いくつかのゲームをする必要があります。

私は非常に難しい問題を抱えていました。なぜなら、製品に奇妙なClassloaderがあって、ライブラリを読み込んでしまい、2つの異なるバージョンから2つの異なるバージョンの同じファイルを提供していたのですライブラリの

ただし、これはのように聞こえます。悪い考えです。私は戻って、あなたの問題を解決する別の方法を見つけるだろう。これは長期的には心苦しいだけです。あなたがクラスローダーを調査するとき、おそらくそれはおそらく既にあります。

EDIT:具体的には、両方を「インポート」することはできません。しかし、実行時に両方にアクセスできます。

+0

名前のついたクラスへの参照を持たせたいので、たくさんの別個のクラスローダーインスタンス(そのうちの1つはブートストラップクラスローダーになることができます)が必要だと思います。実際には独自のクラスローダーを作成する必要はありません。 – Mishax

0

com.foo.Barというインターフェイスでメソッドのシグネチャを定義する必要があるように聞こえます。次に、インターフェースの2つの具体的な実装(例えば、com.foo.DefaultBarとcom.foo.SpecialBar)を提供します。このようにして、インタフェースタイプに対してプログラムを作成し、必要に応じて2つの異なる実装間を切り替えることができます。

"反射的なクラップ"の意味を詳しく説明できますか?それはあなたの正確な問題についての洞察を提供するかもしれません。

クラスローダーやその他の低レベルのトリッキーを混乱させないでください。このような問題を解決する最善の方法は、最初に誰もが理解できる明確なデザインを持つことです。

+1

古いスキーマを使用しているファイルを修正するためのhadoopジョブを作成しようとしているので、avroスキーマを変更する必要がありました。 Avroはあなたに同じクラスとパッケージ名を使用させているようです。 – guidoism

0

としてはすでにはいそれはあなた自身のクラスローダを書い言及またはそれに加えて、あなた

1

のためのクラスロードを行い春分のようなOSGiフレームワークを使用します。あなた自身のClassLoaderを作る必要がありますが、

私はこれをgithubでdemoにしました!

関連する問題