8

オブジェクトが初期化子を実行する前に呼び出されるメソッドを実行時に実装できるようにしたいと思います。これにより、初期化中に使用されるフィールドを設定できます。

次に例を示します。

class A {
  public A() {
    initialize();
  }
  public void initialize() { }
}

class B extends A {
  public String message;
  {
    System.out.println(message);
  }
}

public class MainClass {
  public static void main(final String[] args) throws Exception {

    Class<A> aClass = (Class<A>)Class.forName(args[0]);
    // what's next in order to something like this even though
    // I don't know what subclass of A was passed in as an
    // argument above 
    A a = aClass.newInstance()
    {
      public void initialize() {
        this.message = args[1];
      }
    };
  }
}

おそらくアスペクトを使用することになりますが、純粋なJavaの方法があるかどうかを知りたいと思います。

4

3 に答える 3

1

コンパイルされると仮定して、このようなことを意味しますか(そうではありません):

@Override
A a = aClass.newInstance()
{
  public void initialize() {
        this.message = args[1];
      }
};
于 2011-02-24T03:37:36.030 に答える
1

Java 1.3 以降で利用できるようになったDynamic Proxiesが必要なようです。

編集: 私はmockitoを調べて、具象クラスをどのようにモックしたかを確認しました.バイトコードを作成し、クラスローダーでロードすることがわかりました. それはあなたが望むものを実際には得ないだけでなく、必要以上に複雑です。

私は Stephen C に同意します: なぜこれをやりたいのですか? もっと簡単な方法があるのではないかと思います。あなたにとってよりうまくいくのは、戦略またはコマンドのパターンだと思います。その場合、カスタム コードは独自の小さなクラスにあります。

public class Initializer<A> {

  public (abstract) void initialize(A parent);
}

final String args[] = ...;
Initializer<A> initializer = new Initializer<A>() {
  public void initialize(A parent) {
      parent.setMessage(args);
  }
};

メインクラスに割り当てられるか、メインクラスをラップします(必要に応じて)。

于 2011-02-24T03:50:40.233 に答える
1

あなたがやろうとしていることは、実行時にしか知らないクラスのサブクラスである新しい匿名内部クラスを作成することを伴います。リフレクションはこの問題を解決できません。

動的プロキシは、動的にロードされるインターフェースを実装しようとしている場合に...

私が考えることができる唯一の他のアプローチは、BCEL または動的ソース コード生成/コンパイルを使用することです。そして、どちらも非常に複雑になります。また、どちらも純粋な Java とは見なされません。

私のアドバイスは、あなたが達成しようとしていることを再確認することです. (あなたの質問はそれが何であるかについてのヒントを与えていないので、実用的な提案を提供することは困難です。)

于 2011-02-24T06:21:31.297 に答える