当前位置: 首页 > 面试题库 >

如何从String转换为基本类型或标准Java包装器类型

景理
2023-03-14
问题内容

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

java.lang.String从阐述中得到了一个类型值,我需要将该值转换为方法所期望的适当returnType(它可以是诸如int,boolean,double或wrapper类之类的原语,如Boolean,Integer,Double,Float等)

例:

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?
}

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

我已经看过很多次这样的东西了,但是对我来说似乎不合适:

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;
}

到目前为止,以上都不是我所看到的最糟糕的情况:)

有人在这里有个秘密把戏吗?


问题答案:

据我所知,没有什么可以替代您介绍的版本。您可以稍微简化一下(因为包装器类型均为all
final),但是实际上您需要使用ifswitch或散列来打开类。

我的建议是像上面这样编码。丑陋的代码 本身 仅是一个问题 如果您必须看一下的话。因此,将其放在实用程序方法中,不再赘述。

FWIW-这就是我简化方法的方式:

public static Object toObject( Class clazz, String value ) {
    if( Boolean.class == clazz ) return Boolean.parseBoolean( value );
    if( Byte.class == clazz ) return Byte.parseByte( value );
    if( Short.class == clazz ) return Short.parseShort( value );
    if( Integer.class == clazz ) return Integer.parseInt( value );
    if( Long.class == clazz ) return Long.parseLong( value );
    if( Float.class == clazz ) return Float.parseFloat( value );
    if( Double.class == clazz ) return Double.parseDouble( value );
    return value;
}

这更简单,更有效。它等同于原始版本,因为类是全部,final并且因为规范指出Class对象的相等性是对象身份。

可以说,我们应该使用<wrapper>.valueOf(String)直接返回包装对象的方法。

我没有断言这不是很丑。但是“美”不是衡量代码质量的有用方法,因为它是主观的,并且因为它不能告诉您代码是否易于理解和/或维护。

更新

为了同样支持基本类型,请在if条件中添加相应的类;例如

    if (Boolean.class == clazz || Boolean.TYPE == clazz) {
        return Boolean.parseBoolean(value);
    }

现在可能已经到了点,在类型名称上执行String切换更为有效,尽管还需要考虑一些类型标识的棘手问题。(理论上,您可以有多个具有相同全名的类型,这些类型由不同的类加载器加载。我认为您需要在类加载器中“快速而轻松地播放”,以使用原始包装器类来实现这一点……但是我认为仍然有可能。)



 类似资料:
  • 我有一个< code > Java . lang . reflect . invocation handler ,我需要实现方法invoke() 我的精化中有一个类型为< code>java.lang.String的值,我需要将这个值转换成方法所期望的适当的returnType(它可以是一个像int、boolean、double这样的原语或者像Boolean、Integer、Double、Floa

  • 问题内容: 我想在一个程序包中打印所有的类名,并在每个程序包中打印相应的属性及其数据类型。 在一个代码中,我能够以字符串形式获取类名。在另一个代码中,我可以使用以下方法获取属性及其数据类型 但是我想合并两个代码。由于在第一个代码中我以字符串的形式获得了类名,我无法使用,因为这里是类型。 因此,我需要一种将“ 类名”从类型转换为类型的方法。 我试过了,但是没有用。 问题答案: 确保是完全合格的类名,

  • 为了便于操作基本类型值,JavaScript 还提供了3个特殊的引用类型:Boolean、Number 和 String。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。来看下面的例子。 var s1 = "some text"; var s2 = s1.substring(2); 这个例子中的变量 s1 包含一个字符串,

  • 为了便于操作基本类型值,ECMAScript 还提供了3 个特殊的引用类型:Boolean、Number 和String。这些类型与本章介绍的其他引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。来看下面的例子。 var s1 = "some text"; var s2

  • 基本包装类型 基本包装类型包括:Number、Boolean、String。 每当 读取(访问)基本类型值时,后台就会创建一个 对应的基本包装类型的对象。从而让我们能调用一些方法来操作这个数据。 注:后台自动创建的基本包装类型的生命周期只存在于 执行 这行代码 的瞬间。 var s1 = "hellow javaScript"; var s2 = s1.substring(2); 这个例子中,