字节码操作能否在运行时更改Java方法的返回类型?

字节码操作能否在运行时更改Java方法的返回类型?,java,proxy,javassist,cglib,bytecode-manipulation,Java,Proxy,Javassist,Cglib,Bytecode Manipulation,我想知道是否可以通过字节码操作来执行类似的操作: 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

我想知道是否可以通过字节码操作来执行类似的操作:

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());
并调用字符串参数的重载hi方法。

您能处理
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
    整数.MIN\u值
  • 做上面的把戏

它有点粗糙,在没有原语时看起来最好,因此可以使用
null
作为标记值。希望有人有更好的答案。:)

即使您可以更改返回类型,也无法解决问题。编译器在编译时决定调用重载方法的哪个实现。更改返回类型不会更改调用的方法。字节码仍然会使用
字符串调用
hi(int x)
方法,可能会导致错误。

您的问题太广泛了。但是,为了让您的想象力发挥出来,请在框架的帮助下看看Java。这里有一个小例子:

  BigInteger val = Evaluator.evaluate(new Evaluation() {
        public int evaluate(int x, int y) {
          return x - y;
        }
      }, new BigInteger("2"), new BigInteger("3"));

你到底在干什么?如果只涉及字符串和整数,则可以解析/转换这些参数和返回类型。您应该尝试说明您的问题,而不是将自己局限于字节码操作——通常不需要使用字节码操作。我想在运行时从一个方法转移到另一个方法,即使考虑了我的getBlah()方法的返回类型,这看起来是不可能的。您计划使用哪个字节码库?这很有可能,我以前也做过类似的事情。@Austin你在开玩笑吧?:)Javassist或CGLIB,由你选择。@JohnPristine开什么玩笑?这些不是唯一的图书馆。嗨,欢迎来到stackoverflow!请注意,您可以使用反勾号将代码内联以使其更易于阅读。我只是简单地回答了您的问题。你看过我链接的博客了吗?