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