3

アプリケーション用の特別なアドオンを作成しようとしています。クラス ファイルを編集せずに、クラスのいくつかのメソッドをオーバーライドする必要があります。

スキームは次のとおりです。

class A
{
    public void method1()
    {
        // Do something here
    }

    public int method2()
    {
        // Do something
    }
}

クラス B から、クラス A の method1 func をオーバーライドし、A クラスに新しいメソッドを強制的に使用させたいと考えています。

class B
{
    public void method1()
    {
        Do something
    }
}

A クラスを編集せずに、クラス A のコードを更新したいと考えています。それは可能ですか?

ありがとう。

4

8 に答える 8

4

変更する useclass B extends Aおよび ovverride メソッド。クラスのインスタンスを使用する必要はありBませんA。お気に入り

class B extends A
{
    public void method1(){
      Do something
    }
}
A a = new B();
a.method1();
于 2012-04-06T11:50:57.310 に答える
1

プロキシが問題を解決できるようです。cglibを見てみましょう

Enhancer e = new Enhancer();
e.setSuperclass(A.class);
e.setCallback(new MyCallback());
A proxied = e.create();

そして、ここに MyCallback クラスのサンプル impl があります...

class MyCallback implements MethodInterceptor{
       public Object intercept(Object obj,
                                      Method method,
                                      Object[] args,
                                      MethodProxy proxy){
            Object stuffToReturn = null;
            if ("method1".equals(method.getName()) {
                 //Class B's method1 impl 
            } else {
                 //call the original method in class A
                 stuffToReturn  = method.invoke(proxy, args);
            }

            return stuffToReturn;   
        }
    }
于 2012-04-06T12:18:35.643 に答える
1

いいえ、Java のような言語では、これを直接行うことはできません。new Aは、実行時に常にA、派生のインスタンスではなく、のインスタンスを作成しますB

可能であれば (つまり、 をインスタンス化するすべてのコードを制御Aできる場合)、一種の間接化を導入する不器用な回避策を使用できます。たとえば、 を生成する構成可能なファクトリを持つことができますA(これは、必要に応じて裏で を生成するように切り替わりBます)。これは Java のやり方のようです。A(直接ではなく、ファクトリを介してすべてのコード コンストラクトが必要になります。)

私が間違っていなければ、あなたが探している機能は、Objective C ですぐに利用できますが、Java では利用できません。

于 2012-04-06T12:01:53.290 に答える
0

これを実現する 1 つの方法は、コードで A() コンストラクターを直接呼び出す代わりに、ある種のファクトリ インスタンスを使用して A 型のオブジェクトを作成することです。次に、アドオンは、クラス B のインスタンスを作成するこのファクトリの独自の実装を提供および登録する必要があります。これは、A のインスタンスが作成される前にアドオンがロードおよび初期化される場合にのみ機能します。

もう 1 つの方法は、独自の ClassLoader を実装し、これを使用してロード時にクラス A のバイトコードを変更することです。これを実装するためのアスペクト指向プログラミングのツールを検索できます。これは、クラス A のクラス ロード プロセスを制御できる場合にのみ可能です。

于 2012-04-06T12:04:21.290 に答える
0

継承によって、はい。クラス B の定義を変更するだけです。class B extends A

于 2012-04-06T11:50:33.733 に答える
0

クラスを実際に変更せずにクラスの動作を変更することは不可能ですが、回避策があります。

  1. B は A から継承する必要があります。これは絶対に必要です。A は変更されませんが、その子クラスの動作が変更される可能性があります

  2. method1() と method2() を上書きする

  3. A クラスのオブジェクトがあるとします。これを B に変換すると、その動作が新しいカスタム動作になります。

于 2012-04-06T12:06:00.857 に答える