在Java中动态转换为基元

时间:2010-12-11 09:59:12

标签: java reflection dynamic casting primitive

编辑:这已经解决了。感谢所有帮助过的人。在将对象转换为正确的包装器类之后调用该方法。但String.valueOf()实现相同的效果要简单得多。

您好 -

我想做的事情甚至可能无法实现。我花了几个小时研究和试验各种各样的东西,所以我想我最后会四处询问是否有人知道这是否可能。

是否有可能使用反射动态地将未知类型的图元的包装器作为基元投射?

我基本上试图创建一个通用的toString函数,它可以处理任何类型的基元到字符串的转换。这样一个看似简单的事情令人沮丧地困难(而且我知道我可以测试每种类型以查看它是否为Wrapper.class类型并专门投射它,但此时我只是出于固执而追求这一点。) / p>

以下引发ClassCastException。 primClass类看起来是正确的(在打印primClass.getName()时给出“int”)。

    private String toString(Number obj){
    String result = "";
    try{
        Class objClass = obj.getClass();
        Field field = objClass.getDeclaredField("TYPE");
        Class primClass = (Class)field.get(obj);
        Method method = objClass.getMethod("toString", new Class[]{primClass});
        Object args = new Object[]{primClass.cast(obj)};
        result = (String)method.invoke(null, args);
    }catch(Exception ex){
        //Unknown exception. Send to handler.
        handleException(ex);
    }
    return result;
}

所以我有点不知所措。有人有主意吗?任何帮助将不胜感激。

6 个答案:

答案 0 :(得分:3)

也许我错过了一些东西,但obj.toString()会这样做。

如果你看一下这些实现,就会调用String.valueOf(value)来调用Double.toString(..)Long.toString(..)或其他什么。因此,调用toString()会自动调用所需的方法。没有你的任何反思。

答案 1 :(得分:0)

代码中的直接问题是obj是一个Object,因此不能是基本类型的实例。 (它必须是相应包装类型的实例)。对于任何基本类型类,primClass.cast(obj)调用都必须失败。

但是,如果您只是想将原始包装器实例转换为String,只需调用实例的toString()方法。

答案 2 :(得分:0)

您可能需要查看Apache Commons Lang,尤其是ToStringBuilder.reflectionToString()。即使您不想仅为toString()引入依赖项,它也是开源的,因此您可以查看实现。

method.invoke接受Wrapper类型而不是primivtes类型。

答案 3 :(得分:0)

也许在你的问题中有一些我不理解的东西,但对于原始的,你可以""+primitive将它强制转换为String。

答案 4 :(得分:0)

你要做的事情并没有多大意义....当你用一个原始参数(例如一个int)调用你的函数时,它会自动被装入一个整数。所以你不妨在它上面调用obj.toString().....

但是如果你真的想对基元做一些特别的事情,你可能想要使用方法重载做以下的事情:

private String toString(Object obj){
  return obj.toString();
}

private String toString(int intValue) {
  // code to return string for the primitive int case, assuming it is different
}

// more overloads for other primitive argument types as needed.....

在某些情况下,这可能是处理基元的非常有用的技术。

答案 5 :(得分:0)

String.valueOf(arg)也会做得很好。