我正在尝试创建一个程序,当类名和方法名作为String参数传递给调用者时,该程序执行特定的方法。请考虑以下代码。我有一个CarBean类:
public class CarBean {
private String brand;
private String color;
/**
* @return the brand
*/
public String getBrand() {
return brand;
}
/**
* @param the brand to set
*/
public void setBrand(String brand) {
this.brand= brand;
}
/**
* @return the color
*/
public String getColor() {
return color;
}
/**
* @param the color to set
*/
public void setColor(String color) {
this.color= color;
}
}
现在我想通过以下方法运行它:
runTheMehod("CarBean","getColor");
runTheMethod的实现如下:
public runTheMethod(String className, String methodName){
try {
Object carObj = Class.forName(className).newInstance();
//What to do now???
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException e) {
e.printStackTrace();
}
}
我可以使用类名获取对象。现在我需要将它转换为CarBean对象然后我可以运行它的方法。所以想知道如何在运行时强制转换它,因为每个调用的类名都不同。另外,在尝试调用之前,我可以检查类是否具有特定方法吗?
对此问题的任何建议都将不胜感激。此外,我很想知道是否有更好的方法来做到这一点。
答案 0 :(得分:4)
现在该做什么???
您现在可以在carObj
上调用此方法:
Method method = carObj.getClass().getMethod(methodName);
method.invoke(carObj);
另见:
答案 1 :(得分:1)
如果您要做的就是按名称调用方法,则无需将其强制转换为任何方法。使用Object
进一步反射就足够了。
请参阅Class.getDeclaredMethod()
,如下所示:
Object carObj = ...;
Method method = carObj.getClass().getDeclaredMethod(methodName, ...);
Object retObj = method.invoke(carObj, ...);
请注意,我们并不关心carObj
实际上是什么类型,但如果您想查看,则可以始终使用instanceof
或Class.isAssignableFrom
或Class.isInstance
。
runTheMethod
返回,该对象就会消失。
顺便说一句,看起来你只是试图获取并设置bean属性。您可能想要查看Apache Commons BeanUtils,然后您的示例变为简单:
CarBean bean = ...;
String color = (String)PropertyUtils.getSimpleProperty(bean, "color"); // calls getter.
答案 2 :(得分:0)
我怀疑您真的需要这样做。我怀疑您有XY Problem。您的问题有点类似于询问Java是否具有eval
函数和the correct answer is similar:
首先问自己,这些String
来自哪里?程序的另一部分是生成它们还是由用户提供输入?