Reflection使用包装类调用带有Primitive参数的Methods

时间:2014-05-06 23:02:12

标签: java reflection

我目前正在开发一个项目,我需要向编译时不知道参数类型的方法发出请求,并且它们在运行时被解析。到目前为止,它一直运作良好,但我只是碰到了一点速度。

问题

我面临的问题实际上是令人沮丧的简单。我试图致电JTextField.setVisible()。如我们所知,setVisible采用boolean类型的一个参数。我的代码解析了一些XML,并返回类型为Boolean的对象。尝试使用boolean包装器对象调用此方法时,我收到NoSuchMethodException,因为在解析方法时无法将Boolean映射到boolean

我的问题

有没有办法在运行时解析基本类型,并传入该类代替包装类?

我的代码

首先,解析一些用户输入。然后,通过以下方法过滤此用户输入,该方法将String输入转换为Object输出:

 /**
 * Converts a string value to it's appropriate primitive value.
 *
 * @param input the string value usually taken from the XML.
 * @return the object representing the value in the string.
 */
public static Object toPrimitive(String input) {
    if (input.matches(Constants.INTEGER_PATTERN)) {
        return new Integer(input);
    } else if (input.matches(Constants.DOUBLE_PATTERN)) {
        return new Double(input);
    } else if (input.matches(Constants.BOOLEAN_PATTERN)) {
        return new Boolean(input);
    } else {
        return input;
    }
}

然后最终传播到以下方法,尝试解析setter:

// Cycle through each value and populate instance with it, assuming a setter.
String setterName = toSetter(key);
Object value = namedParameter.get(key); // Value returned from method.

// Execute the setter, adding the value to the object.
Method setter = clazz.getDeclaredMethod(setterName, value.getClass());
setter.invoke(instance, value);

setter.invoke(instance, value)行,我收到了NoSuchMethodException。有没有可用的解决方案?

我尝试解决方案

我有想法编写一个方法来将包装类映射到原始类,现在看起来像这样:

/**
 * Converts a wrapper class to it's primitive type.
 * @param type
 * @return
 */
public static Class wrapperToPrimitiveClass(Class type) {
    if(isPrimitive(type)) {
        if(type == Integer.class) {
            return int.class;
        }
        else if(type == Double.class) {
            return double.class;
        }
        else if(type == Character.class) {
            return char.class;
        }
        else if(type == Byte.class) {
            return byte.class;
        }
        else if(type == Boolean.class) {
            return boolean.class;
        }
        else if(type == Float.class) {
            return float.class;
        }
        else if(type == Long.class) {
            return long.class;
        }
        else {
            return short.class;
        }
    }

    return null;
}

但是,我仍然收到相同的消息,只是这次它声称该方法不存在,即使使用boolean类型。现在,我知道这是错误的,因为这将编译良好:

JTextField field = new JTextField();

field.setVisible(true);

但是,当尝试通过反射进行相同的调用时,我仍然收到错误。

错误消息

尝试使用包装器类时,我看到了:

java.lang.NoSuchMethodException: javax.swing.JTextField.setVisible(java.lang.Boolean)
at java.lang.Class.getDeclaredMethod(Class.java:2004)
at com.block.executor.impl.ParamFactory.populateWithSetters(ParamFactory.java:366)
at com.block.executor.impl.ParamFactory.getParametersAsObject(ParamFactory.java:333)
at com.block.executor.impl.ParamFactory.getParameter(ParamFactory.java:64)
at com.block.executor.impl.ParamFactory.getParametersAsList(ParamFactory.java:125)
at com.block.executor.impl.ParamFactory.getParameter(ParamFactory.java:58)
at com.block.executor.impl.Executor.executeBlockReference(Executor.java:135)
at com.block.executor.impl.Executor.execute(Executor.java:51)
at com.block.program.Blocks.execute(Blocks.java:49)
at com.block.program.StartUp.main(StartUp.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

在尝试原语时,我看到了:

java.lang.NoSuchMethodException: javax.swing.JTextField.setVisible(boolean)
at java.lang.Class.getDeclaredMethod(Class.java:2004)
at com.block.executor.impl.ParamFactory.populateWithSetters(ParamFactory.java:373)
at com.block.executor.impl.ParamFactory.getParametersAsObject(ParamFactory.java:339)
at com.block.executor.impl.ParamFactory.getParameter(ParamFactory.java:64)
at com.block.executor.impl.ParamFactory.getParametersAsList(ParamFactory.java:125)
at com.block.executor.impl.ParamFactory.getParameter(ParamFactory.java:58)
at com.block.executor.impl.Executor.executeBlockReference(Executor.java:135)
at com.block.executor.impl.Executor.execute(Executor.java:51)
at com.block.program.Blocks.execute(Blocks.java:49)
at com.block.program.StartUp.main(StartUp.java:24)

0 个答案:

没有答案
相关问题