【问题标题】:Java dynamic function callingJava动态函数调用
【发布时间】:2010-06-16 05:44:25
【问题描述】:

我有一个字符串数组,其中包含 yyyyyy 类中的方法名称

xxxxxx 类中,我正在创建一个yyyyyy 实例(比如obj)。现在我可以调用obj.function_name(),但我想在循环中从字符串数组中读取function_name。这可能吗?

【问题讨论】:

  • 你能详细说明一下吗?不太清楚。
  • 我相信您正在寻找的术语是“反射”。
  • 是的,使用反射和动态方法调用您可以做到这一点。如果你用谷歌搜索“java 动态方法调用”,你会得到一些有趣的结果。这是tutorial。这实现了一种您所描述的绘图语言。
  • 我也确定他的意思是这个:stackoverflow.com/questions/160970/…

标签: java reflection


【解决方案1】:

您可以使用reflection。调用Yyyy.class.getMethod("methodName").invoke(someArgs)

你必须处理一堆异常,你的方法必须是public。请注意,Java 编码约定更喜欢methodName 而不是method_name

但是,使用反射应该是最后的手段。您应该使用更多面向对象的技术。

如果你经常需要类似的功能,也许你可以看看在java平台上运行的一些动态语言,比如Groovy

【讨论】:

    【解决方案2】:

    可以使用反射,但如果您需要这种行为,您可能应该对您的设计提出一些质疑。 Class.getMethodString 用作方法名称并返回一个Method 对象,然后您可以调用.invoke 来调用该方法

    这些 Javadoc 页面应该会有所帮助:

    示例代码(假设yyyyyy 方法采用一个int 参数,只是为了显示参数传递):

    yyyyyy obj = new yyyyyy();
    String[] methodNames = {"foo", "bar", "baz"};
    for(String methodName : methodNames) {
        Method method = Class.forName("yyyyyy").getMethod(methodName, new Class[] {int.class});
        method.invoke(obj, 4); // 4 is the argument to pass to the method
    }
    

    【讨论】:

    • 你为什么不用obj.getClass() 而不是Class.forName("yyyyyy")
    • 链接搞砸了,尝试用 %29 替换 ( 和 )
    • @Marc 我实际上更喜欢yyyyyy.class,但任何工作都可以
    • @Michael Mrozek 使用obj.getClass() 的优势在于它始终返回正确的类型,即使在重构obj 变量之后也是如此。
    猜你喜欢
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2018-02-02
    相关资源
    最近更新 更多