【问题标题】:Method object with generics for return type?具有泛型返回类型的方法对象?
【发布时间】:2015-09-26 17:08:27
【问题描述】:

有没有办法在 Java 中将泛型与 Method 类一起使用?我想在 Method 对象上调用 invoke() 并让它返回方法的实际返回类型,而不是 Object

【问题讨论】:

  • 好吧,invoke() 的返回类型是 Object,除了替换 JDK 开发团队负责人的 Brian Goetz 并决定在 Java 9 中更改它之外,没有其他方法可以更改它。您不能更改 Java 中的方法。没有办法使非泛型方法泛型。
  • @JBNizet 既然别无选择,请您将其发布为答案吗?

标签: java generics


【解决方案1】:

您不能扩展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 问题。一些关于你究竟需要什么的细节会更容易回答。

【讨论】:

    【解决方案2】:

    正如 JB Nizet 所说,您不能更改 JRE 方法,但您可以在执行之前、执行之后或执行前后做一些事情,您可以使用 AOP 技术更改方法返回的返回值/对象,例如aspectJ,spring aop,谷歌它会是你的朋友

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多