【问题标题】:getClass().getMethod("name", unknown)getClass().getMethod("名称",未知)
【发布时间】:2010-12-17 19:32:47
【问题描述】:

对于我正在创建的一个真正抽象的应用程序,我需要调用方法而不知道它们的参数类型,而只知道字符串形状的参数。

假设我有方法;

getNames(String like, int amount);

我有一个包含 2 个参数的字符串数组,所以假设我有;

String[] params = new String[] {"jack", "25"};

有什么方法可以使用 params 数组获取和调用此方法?

【问题讨论】:

    标签: java reflection methods getmethod


    【解决方案1】:

    你可以试试

    
    String[] params = new String[] {"jack", "25"};
    Object[] realParams = new Object[params.length];
    Method[] methods = getClass().getMethods();
    for (Method method : methods) {
      if (method.getParameterTypes().length == params.length) {
         for (int i = 0; i < method.getParameterTypes().length; i ++) {
            Class<?> paramClass = method.getParameterTypes()[i];
            if (paramClass = String.class) {
               realParams.add(param);
            } else if (paramClass == Integer.class || paramClass == Integer.TYPE) {
               realParams.add(Integer.parseInt(param));
            } else if (other primitive wrappers) {
                ...
            } else {
              realParams.add(null); // can't create a random object based on just string
              // you can have some object factory here, or use ObjectInputStream
            }
         }
         break; // you can continue here if the parameters weren't converted successfully,     
         //to attempt another method with the same arguments count.
      }
    }
    

    【讨论】:

    • 知道方法的情况下如何将字符串转换成需要的参数,能举个例子吗?
    • 使用该解决方案,您不能拥有两个具有相同数量参数的方法。除非您被告知要执行的方法的名称或要使用的参数的类型,否则不可能这样做。
    【解决方案2】:

    听起来像元编程。如果您设置在 JVM 平台上,您可能需要研究 Groovy/Scala。

    【讨论】:

      【解决方案3】:

      查看 Java 反射 API,它们应该(虽然我记不太清了)应该能够为您提供确定不同类型参数所需的信息。然后,您必须遍历列表并根据反射 API 告诉您的有关方法的内容智能地转换每个列表。

      【讨论】:

        【解决方案4】:

        对于动态编程,请使用动态编程语言。 Java 不太适合那种东西。

        无论如何,请查看反射 API,但如果您打算为您的应用程序进行大量这样的编程,请考虑其他替代方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-12
          • 1970-01-01
          • 2014-11-19
          • 2018-10-27
          • 2013-04-26
          • 2016-09-16
          • 2012-04-03
          相关资源
          最近更新 更多