java - 结合 Java 泛型和反射以避免强制转换

标签 java generics reflection casting

我有这样的代码:

Object doMethod(Method m, Object... args) throws Exception {
    Object obj = m.getDeclaringClass().getConstructor().newInstance();
    return m.invoke(obj, args);
}

我使用的代码有点复杂,但就是这样。要调用 doMethod,我会这样做:

Method m = MyClass.class.getMethod("myMethod", String.class);
String result = (String)doMethod(m, "Hello");

这对我来说效果很好(可变数量的参数和所有参数)。 让我恼火的是在调用者中必须强制转换为 String因为 myMethod 声明它返回一个 String,我希望 doMethod 足够聪明,可以将其返回类型也更改为 String。有没有办法使用 Java 泛型来完成这样的事情?

String result = doMethod(m, "Hello");
int result2 = doMethod(m2, "other", "args");

最佳答案

当然,

@SuppressWarnings("unchecked")
<T> T doMethod(Method m, Class<T> returnType, Object Args ...) {
    Object obj = m.getDeclaringClass().getConstructor().newInstance();
    return (T) m.invoke(obj, args);
}

String result = doMethod(m, m.getReturnType(), "Hello");

人们对要求完成这样的事情的架构很好奇,但这超出了范围:)

如果您不喜欢这样,您也可以取消 returnType 的绑定(bind),编译器会自动将其转换为您将返回类型分配给的任何对象。例如,这是合法的:

@SuppressWarnings("unchecked")
<T> T doMethod(Method m, Object Args ...) {
    Object obj = m.getDeclaringClass().getConstructor().newInstance();
    return (T) m.invoke(obj, args);
}

Actor 将是你试图分配给的任何人,但我认为大多数人会认为这是可疑的。

关于java - 结合 Java 泛型和反射以避免强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5914995/

相关文章:

java - Eclipse 自动重构字符串比较

Java Swing 2D小游戏: how to modelize the view?

java - 错误的通用返回类型

c# - 如何确定给定 .NET 程序集使用的子系统?

Java:使用字符串来停止 while 循环,并由以下扫描仪输入消耗

java - 如何更改不同 Java 类中面板上的 setVisible()

java - 需要在运行时传递类泛型scala

可比较的Java实例

javascript - 将属性名称隐式传递给对象方法的正确方法是什么?

c# - 通过反射调用扩展方法(Type.InvokeMember)