繁体   English   中英

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

[英]Run a java method by passing class name and method name as parameter

我正在尝试创建一个程序,当类名称和方法名称作为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

如果您要做的就是按名称调用方法,则无需将其强制转换为任何方法。 使用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.

我怀疑你真的需要这样做。 我怀疑你有一个XY问题 您的问题有点类似于询问Java是否具有eval函数且正确答案是否相似

首先问问自己,这些String来自哪里? 您的程序的另一部分是否生成了它们,或者是用户提供的输入?

  • 我的程序的另一部分生成它 :因此,您希望程序的一部分决定要执行的操作类型,但不执行操作,以及执行所选操作的第二部分。 而不是生成然后评估String ,而是根据您的具体情况使用策略命令构建器设计模式。

  • 它是用户输入 :用户可以输入任何内容 ,包括类和方法名称,这些名称在执行时可能导致程序行为异常,崩溃,泄露应该保密的信息,破坏持久性信息(如数据库内容),和其他这样的肮脏。 防止这种情况的唯一方法是解析String ,然后立即在成功的解析上执行该方法,或让解析器创建一个Command对象供以后执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM