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,-1Integer.MIN_VALUE
  • 做上面的伎俩

它有点hacky,当你没有原语时它看起来最好,所以你可以null用作你的标记值。希望有人有更好的答案。:)

于 2012-11-15T17:56:11.047 回答
0

即使您可以更改返回类型,也无法解决问题。编译器在编译时决定调用哪个重载方法的实现。更改返回类型不会更改调用的方法。字节码仍会hi(int x)使用 a 调用该方法,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 回答