首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将字符串转换为基元类型或标准java包装类型

如何将字符串转换为基元类型或标准java包装类型
EN

Stack Overflow用户
提问于 2012-12-19 08:06:37
回答 5查看 34K关注 0票数 23

我有一个java.lang.reflect.InvocationHandler,并且我需要实现方法invoke()

我从我的精化中得到了一个java.lang.String类型的值,我需要将这个值转换成方法所期望的适当的returnType (它可以是一个原始的,如整型,布尔型,双精度或包装类,如布尔型,整型,双精度型,浮点型等)。

示例:

代码语言:javascript
复制
public Object invoke(Object proxy, Method method, Object[] args) 
        throws Throwable {
    String computedValue = compute(...);
    return convert(method.getReturnType(), computedValue);
}

private Object convert(Class<?> returnType, String stringValue) {
    return ...; // what's the simplest way?
}

我不希望简单地实现复杂对象之间的自动转换,但我希望有一种简单的方法将字符串转换为标准的java类型。

我见过(太多)这样的东西,但对我来说似乎并不合适:

代码语言:javascript
复制
public static Object toObject( Class clazz, String value ) {
    if( Boolean.class.isAssignableFrom( clazz ) ) return Boolean.parseBoolean( value );
    if( Byte.class.isAssignableFrom( clazz ) ) return Byte.parseByte( value );
    if( Short.class.isAssignableFrom( clazz ) ) return Short.parseShort( value );
    if( Integer.class.isAssignableFrom( clazz ) ) return Integer.parseInteger( value );
    if( Long.class.isAssignableFrom( clazz ) ) return Long.parseLong( value );
    if( Float.class.isAssignableFrom( clazz ) ) return Float.parseFloat( value );
    if( Double.class.isAssignableFrom( clazz ) ) return Double.parseDouble( value );
    return value;
}

到目前为止,上面的还不是我见过的最糟糕的:)

这里有谁有秘诀吗?

EN

回答 5

Stack Overflow用户

发布于 2012-12-19 17:33:26

我想我找到了什么

代码语言:javascript
复制
import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager;

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    String returnValue = ...
    return convert(method.getReturnType(), returnValue); 
}

private Object convert(Class<?> targetType, String text) {
    PropertyEditor editor = PropertyEditorManager.findEditor(targetType);
    editor.setAsText(text);
    return editor.getValue();
}

我认为这3行代码比多个is更好,而且我避免添加外部库依赖项,因为java.beans包在Java标准库(javadocs:PropertyEditorManager)中。

我发现这是可以接受的;我唯一的困惑是PropertyEditor包含在java.beans包中,我更喜欢java.utiljava.lang.reflect包中提供的内容,因为这些代码实际上与java.beans无关。

上面的代码还有一个好处,就是您可以注册额外的PropertyEditor实例来转换复杂的对象。不过,这并不是一件坏事。

我认为它比一个in列表更好,不仅在美观上,而且在质量上。

票数 26
EN

Stack Overflow用户

发布于 2017-06-01 23:44:07

也许org.apache.commons.beanutils.ConvertUtils能帮上忙?

代码语言:javascript
复制
import org.apache.commons.beanutils.ConvertUtils;
// ...
final Object v = ConvertUtils.convert("42", Integer.class);
票数 7
EN

Stack Overflow用户

发布于 2012-12-19 08:19:41

我建议这样做:

代码语言:javascript
复制
List<Class<?>> clsList = new ArrayList<Class<?>>();
clsList.add(Boolean.class);
clsList.add(Integer.class);
//etc.

for (Class<?> cls : clsList) {
    if (cls.isAssignableFrom(clazz)) {
        return cls.getMethod("valueOf", new Class[] { String.class }).invoke(null, new Object[] { value });
        //Missing in this example: Handle a few exceptions
    }
}

这个看起来更干净还是更丑陋,我留给你了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13943550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档