【发布时间】:2015-09-26 17:08:27
【问题描述】:
【问题讨论】:
-
好吧,invoke() 的返回类型是 Object,除了替换 JDK 开发团队负责人的 Brian Goetz 并决定在 Java 9 中更改它之外,没有其他方法可以更改它。您不能更改 Java 中的方法。没有办法使非泛型方法泛型。
-
@JBNizet 既然别无选择,请您将其发布为答案吗?
【问题讨论】:
您不能扩展Method,因为虽然它不是final,但它没有可访问的构造函数。
你可以用合成来做这样的事情。
public final class MyMethod<T> {
private final Method method;
public MyMethod(Method method) {
this.method = method;
}
public T invoke(Object o, Object... args) throws IllegalAccessException, InvocationTargetException {
return (T) method.invoke(o, args); // Unchecked cast
}
}
你可以这样使用它
MyMethod<Integer> myMethod = new MyMethod<>(BigInteger.class.getMethod("intValue"));
Integer a = myMethod.invoke(new BigInteger("42"));
但是,这并不好(例如,未经检查的强制转换和检查的异常)。
我怀疑这是一个 XY 问题。一些关于你究竟需要什么的细节会更容易回答。
【讨论】:
正如 JB Nizet 所说,您不能更改 JRE 方法,但您可以在执行之前、执行之后或执行前后做一些事情,您可以使用 AOP 技术更改方法返回的返回值/对象,例如aspectJ,spring aop,谷歌它会是你的朋友
【讨论】: