1

私はバイトコード操作でこのようなことをすることが可能かどうか疑問に思いました:

public class Foo {
    public int getBlah() {
       return 1;
    }
}

public void hi(int x) {
    System.out.println("hi: " + x);
}

public void hi(String x) {
    System.out.println("wow: " + x);
}

今私は電話したい:

hi(foo.getBlah());

Stringパラメーターのオーバーロードhiメソッドを呼び出します。

4

3 に答える 3

2

フラグが立てられた値を処理できますhi(int x)か?はいの場合、次のようなことができます。

public void hi(int x) {
    if (x == Integer.MIN_VALUE) {
        String newParam = getTheParamFromProxySomehow();
        hi(newParam);
        return;
    }    
    System.out.println("hi: " + x);
}

それは基本的に:

  • getBlah()メソッドをプロキシ経由でインターセプトする
  • オーバーロードされたメソッドThreadLocalに渡したい文字列パラメータを(?に)保存しますhi
  • 0、、などのフラグ付きの値を返し-1ますInteger.MIN_VALUE
  • 上記のトリックを実行します

これは少しハッキーで、プリミティブがない場合に最適に見えるためnull、フラグ付きの値として使用できます。うまくいけば、誰かがより良い答えを持っています。:)

于 2012-11-15T17:56:11.047 に答える
0

返品タイプを変更しても問題は解決しません。コンパイラは、コンパイル時に、オーバーロードされたメソッドのどの実装が呼び出されるかを決定します。戻りタイプを変更しても、呼び出されるメソッドは変更されません。バイトコードは引き続きaを使用してhi(int x)メソッドを呼び出し、Stringおそらくエラーを引き起こします。

于 2012-11-15T23:39:17.600 に答える
0

あなたの質問は広すぎます。しかし、想像力を働かせるために、 ASMフレームワークの助けを借りてJavaでの操作の過負荷についての私の古いブログを見てください。そこからの小さな例を次に示します。

  BigInteger val = Evaluator.evaluate(new Evaluation() {
        public int evaluate(int x, int y) {
          return x - y;
        }
      }, new BigInteger("2"), new BigInteger("3"));
于 2012-11-16T03:38:32.460 に答える