0

別の 3pp クラスによって呼び出される 3pp クラスのメソッドを置き換えようとしています。ホール クラスを書き直し、クラス パスの順序を変更するかどうかはわかっています。または、拡張クラスローダーが元のクラスではなく私のクラスをロードするよりも、Javaホームのlib/extに配置します。

しかし、元のクラスを置換クラスから拡張するにはどうすればよいですか:

package com.example
public class Foo extends com.example.Foo {
    @Override
    public void m1() {
    }
}

この例が機能しないことはわかっていますが、目標を説明しようとしています。このクラスは元のクラスを同じ正規名で拡張し、1 つのメソッドがオーバーライドされ、他のすべてのメソッドが継承されます。したがって、3pp 製品のバージョンを上げても、カバーしたいメソッドのみをオーバーライドするため、クラスを変更する必要はありません。

誰か良い解決策や良いアイデアを持っていますか?

4

1 に答える 1

0

あなたがしていることは非常に難しいことです.Webアプリケーションで作業している場合、拡張しようとしているクラスがライブラリ内で使用されていると機能しません.JARに使用するクラスSomeServiceがある場合クラスFooクラスローダが JAR 内のクラスをロードします。
もう1つのことは、この方法でクラスをオーバーライドするのはあまり良くないということです。私が提案できるのは、AOPを使用してそのメソッドをオーバーライドすることです。
Spring を使用している場合、それを行うための強力なシステムhttp://static.springsource.org/spring/docs/current/spring-framework-reference/html/aop.htmlがありますが、Spring コンテキスト内でのみ機能します。
それ以外の場合は、AspectJを使用できます(誠に申し訳ありませんが、私はそれを使用したことはありません)。

最後に、このクラスは 3pp ライブラリ内でのみ使用されますか?

于 2012-07-30T10:43:02.480 に答える