【问题标题】:Java: Cast String to primitive type dynamicallyJava:将字符串动态转换为原始类型
【发布时间】:2013-07-17 04:59:12
【问题描述】:

我想通过java中的反射来调用一个方法。

我手头有我要调用的方法的Method 实例(因此我可以获取其参数的类型),此外,我将这些参数的值作为字符串。

我假设所有参数都必须是原语。

例如,如果我想调用以下方法:

public static double calc(int a, double b, String op){...}

我将参数作为字符串数组:

String[]: {"25", "34.45", "add"}

那么,如何将这个 String 数组转换为包含 (int, double, string) 的数组? 我知道我可以遍历所有原始类型并尝试解析每种类型的值......有没有更简单的方法?类似于“通用解析”方法。

【问题讨论】:

  • 通用解析!您的要求根本不通用,将每个元素解析为不同的数据类型不通用!
  • 你说得对,我提到反射只是为了说明我想做的动机。
  • 没有这样的东西,至少标准实现。但是您可以轻松地制作自己的:知道方法,找出参数类型,然后在循环中根据所需的参数类型解析字符串表示。
  • 没有“将字符串转换为 [a] 原始类型”之类的东西。你必须转换。

标签: java reflection casting


【解决方案1】:

您不应该遍历所有原始类型并尝试解析每种类型的值。

您应该从Method 实例中获取每个参数的类型,并根据参数的类型,调用适当的方法将字符串转换为所需的类型:Double.valueOf() for a double (Double.TYPE )、Integer.valueOf() 用于 int (Integer.TYPE) 等。

【讨论】:

  • 但重点是,我没有明确的类型,我将它们作为Type 实例(我从method.getParameterTypes() 获得),即我不知道第一个是int,第二个是double,最后一个是String
  • if (type.equals(Integer.TYPE)) { arg = Integer.valueOf(s); } else if (type.equals(Double.TYPE)) { arg = Double.valueOf(s); } ...
  • 所以我需要检查所有原始类型并这样做......没有更短的方法吗?
  • 我不知道任何其他方式。只有 8 种原始类型。应该不会太难。
【解决方案2】:

你可以从commons-beanutils 使用ConvertUtils,参见[convert 方法](https://commons.apache.org/proper/commons-beanutils/javadocs/v1.9.2/apidocs/org/apache/commons/beanutils/ConvertUtils.html#convert(java.lang.String, java.lang.Class))。但是,您需要在类型数组上实现循环...

【讨论】:

    【解决方案3】:

    首先,恕我直言,您的问题与反思无关。原始类型不能使用反射来实例化。反射仅适用于对象。

    如何将此字符串数组转换为包含 (int, 双倍,字符串)?

    你不能。 Java 中的数组不能包含不同的数据类型。一种解决方法是使用List<Object>。问题是这将需要稍后进行强制转换以检索元素(有可能获得ClassCastException)。

    有没有更简单的方法?类似于“通用解析”方法。

    我不知道标准库中有这样的东西。我怀疑有什么,因为"25" 应该解析成什么? int? long? float? BigInteger?这取决于开发人员,因此您必须自己编写。

    【讨论】:

    • 我不是要转换数组本身,而是要迭代它的元素。关于您的第二条注释,我提到我有类型,即我正在寻找一种方法,该方法采用我想要转换为的 String ("25") 和 Class> 对象(在这种情况下为 int 或 Integer)它会返回一个 Object (new Integer(25))
    • 哦,我没有看到你有每个参数的类。我的错。您的问题仍然有一些令人困惑的陈述,例如 “参数必须是原语”String 不是原语。另外我的意思是你不能得到一个不同类型的数组,但你可以使用List
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2018-04-26
    • 2013-03-20
    相关资源
    最近更新 更多