有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java如何检查字符串值是否是给定类的类型<?>

好吧,这是一个复杂的问题,我完全迷路了

假设您有一个字符串和一个泛型类。像这样

String string;
Class<?> clazz;

如何检查字符串是否表示类可以等于的值

比如说:

String string = "true";
Class<?> clazz = Boolean.class;

我如何检查并确定字符串“true”实际上是一个布尔值

这里是另一个例子。让我们说:

String string = "true";
Class<?> clazz = Integer.class;

如何检查并确定字符串“true”不是整数


共 (5) 个答案

  1. # 1 楼答案

    考虑到您只希望对包装类型使用此方法,您可以在此处使用一些反射hack(为简洁起见,此处忽略了对无关代码的异常处理):

    String string = "ABC";
    Class<?> clazz = Integer.class;
    
    Method method = clazz.getDeclaredMethod("valueOf", String.class);
    
    if (method != null) {
        try {
            Object obj = method.invoke(null, string);       
            System.out.println("Success : " + obj);
    
        } catch (InvocationTargetException ex) {
            System.out.println("Failure : " + string + " is not of type " + 
                                              clazz.getName());
        }
    }
    

    我考虑到这样一个事实,即每个包装器类都有一个静态valueOf方法,该方法接受类型为String的参数,并返回该wrapper类型的值。如果参数不能转换为相应的包装器类型,则引发异常

    因此,在上述情况下,如果抛出异常,string值不是clazz类型

    p.S.:注意,对于Boolean.class,任何不是"true"的字符串都将被视为false

  2. # 2 楼答案

    在javascript中,可以对字符串求值()。在Java中,您没有这样的方法。您必须为该检查实现自己的启发式

    但是,您可以做的一件事是尝试用给定的类解析字符串。比如:

    Iteger.parseInt(stringValue);
    

    如果解析成功,那么字符串可以用作该类型的值。如果失败,那么您将得到一个异常。执行这些检查,然后扣除一些结论

  3. # 3 楼答案

    我假设您正在实现某种规范/协议或类似的东西

    1. 看看说明书
    2. 定义有效输入的语法
    3. 解析语法

    这类似于编程语言对文本所做的操作

  4. # 4 楼答案

    我会考虑使用javabeans ^ {< CD1>}机制。

    @Test
    public void testIsOfType() {        
        assertFalse(test("nope", Integer.class));
        assertFalse(test("nope", Boolean.class));
    
        assertTrue(test("1", Integer.class));
        assertTrue(test("true", Boolean.class));
    }
    
    boolean test(String str, Class<?> clazz) {
        PropertyEditor propertyEditor = PropertyEditorManager.findEditor(clazz);
        if (propertyEditor != null) {
            try {           
                propertyEditor.setAsText(str);
                return true;
            } catch (Exception ex) {}
        }
        return false;
    }
    

    这避免了显式反射的需要,如果您决定需要测试除原语包装器之外的类,您可以向PropertyEditorManager.registerEditor()注册一个新的编辑器

    不幸的是,这仍然存在Rohit解决方案的问题,即test("1", Number.class)将失败

  5. # 5 楼答案

    我现在无法测试这个解决方案,但为什么不能这样做呢?如果您可以自己枚举所有可能的类,只需在类上创建一些switch语句

    boolean isStringClass (Class clazz, String string) {
    
        try {
            if (Integer.class == clazz) {
               Integer.valueOf(string);
            } else if (Boolean.class = clazz) {
               Boolean.valueOf(string);
            } [...etc]
        } catch (Exception e) {
            return false;
        }
    
        return true;
    }
    

    当然,您需要知道所有可能的类,并且需要知道属于该类的方法,该类能够解析字符串并返回其类型。对于将是valueOf的基本包装器

    如果您计划只转换包装器,Rohit的解决方案将是一个更好的选择。但是,如果您没有这样做,并且无法将valueOf方法添加到此新类,那么这可能是您唯一的选择