字节码操作能否在运行时更改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!请注意,您可以使用反勾号将代码内联以使其更易于阅读。我只是简单地回答了您的问题。你看过我链接的博客了吗?