通过将类名和方法名作为参数传递来运行java方法

我正在尝试创建一个程序,当类名称和方法名称作为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对象然后我可以运行它的方法。 所以想知道如何在运行时强制转换它,因为每个调用的类名都不同。 另外,在尝试调用之前,我可以检查类是否具有特定方法吗?

任何关于这个问题的建议都将受到赞赏。 此外,我很想知道是否有更好的方法来做到这一点。

现在做什么???

您现在可以像这样调用carObj上的方法:

 Method method = carObj.getClass().getMethod(methodName); method.invoke(carObj); 

也可以看看:

Method.invoke

如果您要做的就是按名称调用方法,则无需将其强制转换为任何方法。 使用具有进一步reflection的Object就足够了。

请参阅Class.getDeclaredMethod() ,如下所示:

 Object carObj = ...; Method method = carObj.getClass().getDeclaredMethod(methodName, ...); Object retObj = method.invoke(carObj, ...); 

请注意,我们并不关心carObj实际上是什么类型,但如果您想检查,您可以始终使用instanceofClass.isAssignableFromClass.isInstance

但是,有点奇怪的是,您正在实例化一个新对象,然后一次性调用其中一个方法。 一旦你的runTheMethod返回,该对象就会消失。


顺便说一句,看起来你只是想获取并设置bean属性。 您可能想要查看Apache Commons BeanUtils ,然后您的示例变得简单:

 CarBean bean = ...; String color = (String)PropertyUtils.getSimpleProperty(bean, "color"); // calls getter.