【问题标题】:How to know if method is taking array as param using reflection如何知道方法是否使用反射将数组作为参数
【发布时间】:2011-06-20 14:31:22
【问题描述】:

我正在尝试使用给定的输入参数调用 API。输入参数以列表的形式出现。现在我的工作是一一获取 API 的参数类型,并从 List 中构建所需的类型实例。我可以为简单的 java 类型、List、Set 做,但我被困在数组中。

Method  method = getMethodFromTheClassBasedOnvalues(  loadedClass,   apiName, numberOfParams);
     Type[] apiMethodParams = method.getGenericParameterTypes();
         List<Type> expectedParamTypes = Arrays.asList(apiMethodArgTypes);
     List<Object> actualValues = // method input.

    List<Object> argsList = new ArrayList<Object>();
    for (int i = 0; i < expectedParamTypes.length; i++) {
        argsList.add(castToRequiredType(expectedParamTypes.get(i),
                actualValues.get(i)));

    method.invoke(loadClass.newInstance(), argsList.toArray());

当我得到 API (String, String[]) 类型的方法时,问题就来了 [class java.lang.String, class [Ljava.lang.String;] 或者如果一个参数 [Ljava.lang.String; 基于此,我怎么知道它是否采用字符串数组。我看到不同之处在于类名在 [L 之后开始并以; 结束。但有保证吗? CustomObject[] 的行为也会相同吗?

有没有什么聪明的方法可以知道该方法是否正在使用一个数组并在最近构建它? 朝这个方向的任何想法都会有所帮助。

提前致谢。

【问题讨论】:

    标签: java arrays reflection methods


    【解决方案1】:

    尝试使用

    类[] Mehotd.getParameterTypes()

    之后你可以调用 Class.isArray() 来判断这个参数类是不是数组

    【讨论】:

      【解决方案2】:

      [L 确实表示对象数组。参见例如here。 但检查某个类是否代表数组的最佳方法是 isArray 方法。

      【讨论】:

        【解决方案3】:

        您还没有显示 castToRequiredType 在做什么,但如果您最终将 Type 转换为 Class,您将能够使用 Class.isArrayClass.getComponentType

        【讨论】:

        • 类型字符串将输入值转换为所需的类型。它可以是这样的。 Object returnValue = null; String type = typeString; if (typeString.contains(CLASS_STRING)) { typeString = typeString.replaceFirst(CLASS_STRING, ""); } if (isTypePrimitive(type)) { returnValue = castToPrimitive(object.toString(), typeString); } else if (type.startsWith("java.util.List")) { returnValue = getListTypeParam(typeString, object);
        • @java_enthu:这不是很清楚,因为类型不是字符串。但我强烈建议反对直接使用字符串表示。
        • @java_enthu:你仍然没有显示typeString来自哪里。
        • 感谢您的快速回复。 typeString 是从 API 参数类型中找到的。如原帖所述。对于 API 的每个参数,我需要从actualValues 列表构建所需的类型对象。expectedParamTypes 将包含我从 API 的 getGenericParamTypes 获取的参数类型列表。
        • @java_enthu: typeString 在这些 cmets 之前没有被提及。我询问了castToRequiredType 发生了什么,这似乎是您使用expectedParamTypes 的地方。正如我之前所说,使用字符串表示是一个非常糟糕的主意,因为你有一个更丰富的 API 和 Class 等。
        猜你喜欢
        • 2012-04-19
        • 2019-12-20
        • 1970-01-01
        • 2011-01-13
        • 1970-01-01
        • 1970-01-01
        • 2014-02-28
        相关资源
        最近更新 更多