1

Java プロジェクトに問題があります。たくさんのプロジェクト (たとえば、A、B、C など) があり、同じパスの src.tool.Tools などのパスのツール フォルダーに Tools クラスがあります。それらすべてに同じクラス名。

これで、これらすべてのプロジェクト (A、B、C など) をビルド パスに含むプロジェクト Z ができました。1 つの Tool クラスをインポートするときに、本当に必要なものをインポートしていることを確認するにはどうすればよいですか?

さらに複雑に、A.Tool に public int tool(){return 1} などのメソッドがあり、B.Tool に public int tool(){return 0} などの別のメソッドがある場合、関数を確実に呼び出すにはどうすればよいですか本当に欲しい?

全てに感謝!

4

4 に答える 4

1

おそらくユーザー定義のクラスローダーを使用しています:

すべてのユーザー定義クラスローダーは、抽象クラス ClassLoader のサブクラスのインスタンスです。アプリケーションは、Java 仮想マシンが動的にロードしてクラスを作成する方法を拡張するために、ユーザー定義のクラス ローダーを使用します。ユーザー定義のクラス・ローダーを使用して、ユーザー定義のソースから派生したクラスを作成できます。たとえば、クラスをネットワーク経由でダウンロードしたり、オンザフライで生成したり、暗号化されたファイルから抽出したりできます。

于 2013-06-28T08:13:25.617 に答える
1

あなたのやりたいことができるとは思えません。すべて「src.tool.Tools」と呼ばれる 3 つのクラスがある場合、Java はどの jar ファイルからそれらをロードしたかを気にしません。3 つのプロジェクト (jar ファイルを意味すると仮定) がすべて同じクラスを持つ場合、Java が衝突し、どのツールが読み込まれるかを予測できなくなります。

正しいものが呼び出されることを確認する唯一の方法は、他の 2 つがクラスパスにないことを確認することです。

あなたの問題に対するハックソリューションがあります。プロジェクトごとに新しい ClassLoader を作成し、Tools クラスの目的のプロジェクトを ClassLoader に要求できます。次に、リフレクションを使用してインスタンス化し、メソッドを呼び出すことができます。各プロジェクトは独自の ClassLoader にあるため、3 つの Tools クラスが衝突することはもうありません。

元:

URLClassLoader a = new URLClassLoader(aJar.toURL(), getClass().getClassLoader());  
Class toolsClass = Class.forName("src.tool.Tools", true, a);  
Method m = toolsClass.getDeclaredMethod("tool");  
Object i = toolsClass.newInstance();  
Object result = m.invoke(instance);  

(URLClassLoader の例は、How should I load Jars dynamic at runtime?から取得しました)

于 2013-06-28T08:13:42.957 に答える
0

プロジェクト A、B、C がそれぞれ異なるパッケージ名前空間 (com.you.A、com.you.B など) を持っていると仮定すると、Tools クラスは com.you.A.tool.Tools のような複数の場所で利用できるようになります。 、com.you.B.tool.Tools など。

したがって、プロジェクト Z で Tools クラスのインスタンスを作成する場合、オブジェクト参照変数を宣言するときに使用する正確なクラスを指定できます。

private com.you.A.tool.Tools toolsFromA;
private com.you.B.tool.Tools toolsFromB;

呼び出すtoolsFromA.tool()と 1 が返され、呼び出すtoolsFromB.tool()と 0 が返されます。

于 2013-06-28T08:13:13.693 に答える