我有一些代码可以从动态类中获取setter方法。但参数可以是java.lang.String
或java.lang.Long
。如何动态获取参数类型?
public Method getDynMethod(Class aClass, String methodName) {
Method m = null;
Class[] paramTypes = new Class[1];
paramTypes[0] = String.class;
try {
m = aClass.getMethod(methodName, paramTypes);
} catch (NoSuchMethodException nsme) {
nsme.printStackTrace();
}
return m;
}
这是调用它的代码
Class c = getDynClass(a.getAssetType().getDBTableName());
for (Long l : map.keySet()) {
AssetProperties ap = new AssetProperties();
ap.setAssetTypeProperties(em.find(AssetTypeProperty.class, l));
ap.setAssets(a);
ap.setValue(map.get(l));
a.getAssetProperties().add(ap);
String methodName = "set" + ap.getAssetTypeProperties().getDBColumn();
Method m = getDynMethod(c, methodName);
try {
String result = (String) m.invoke(c.newInstance(), ap.getValue());
System.out.println(result);
} catch (IllegalAccessException iae) {
iae.printStackTrace();
} catch (InvocationTargetException ite) {
ite.printStackTrace();
} catch (InstantiationException ie) {
ie.printStackTrace();
}
}
我可以将另一个参数传递给方法,但我仍然不知道参数类型是什么
答案 0 :(得分:2)
您可以从method.getParameterTypes()
获取方法的参数类型;即:
public Class[] methodsParamsTypes(Method method) {
return method.getParameterTypes();
}
请参阅here以获取完整示例。
修改强> 现在再读一遍你的问题我不确定上面的答案是你在看什么。
你的意思是你的代码中有来自地图的参数,你想通过反射来调用正确的方法吗?是Long
还是String
?如果是这样的话就是一个例子:
public Method getDynMethod(Class aClass, String methodName, Object...params) {
Method m = null;
Class[] paramTypes = new Class[params.length];
for (int i = 0; i < paramTypes.length; i++) {
//note: if params[i] == null is not possible to retrieve the class type...
paramTypes[i] = params[i].getClass();
}
try {
m = aClass.getMethod(methodName, paramTypes);
} catch (NoSuchMethodException nsme) {
nsme.printStackTrace();
}
return m;
}
在您的代码中,您可以像这样调用它:
Method m = getDynMethod(c, methodName, ap.getValue());
答案 1 :(得分:0)
如果要获取方法的参数类型,则应调用名为
的方法getParameterTypes() 返回一个Class对象数组,它们是预期的参数。
点击此处了解更多信息: Method class Documentation
编辑:我得到了忍者: - (答案 2 :(得分:0)
您可以获取所有方法,并按名称进行过滤:
public Method getDynMethod(Class aClass, String methodName) {
for (Method m : aClass.getMethods()) {
if (methodName.equals(m.getName())) {
Class<?>[] params = m.getParameterTypes();
if (params.length == 1
&& (params[0] == Long.class || params[0] == String.class)) {
return m;
}
}
}
return null;
}