我有这样的代码:
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/