我正在写一个基于反射的RPC服务,它通过各种机制获取传入的参数。有时参数与参数类型正确匹配,有时候它们总是字符串,有时它们会被包含在动态类型的“脚本”对象中,这些对象需要提取出适当的值。将未知对象转换为适当的Method.invoke参数的有效方法?
之前,我可以打电话method.invoke,我需要建立参数列表,像这样:
Object a[] = new Object[method.parameterClasses.length];
for (int i = 0; i < a.length; ++i)
{
a[i] = prepare(method.parameterClasses[i], rpc.arguments[i]);
}
“准备”的方法看起来像是:
Object prepare(Class clazz, Object o)
{
if (o == null) return null;
if (clazz == o.getClass()) return o;
if (clazz == String.class) return o.toString();
// skip a bunch of stuff for converting strings to dates and whatnot
// skip a bunch of stuff for converting dynamic types
// final attempts:
try
{
return clazz.cast(o);
}
catch (Exception e)
{
return o; // I give up. Try the invoke and hope for the best!
}
}
在单元测试,我最近很惊讶地发现一个方法通过了一个盒装Integer,期望一个原始的长实际上是失败的演员,并通过底部,然后在invoke()期间正确转换的东西。我认为打电话给“演员”是可以做到的。有没有什么办法显式地执行和检查通常由invoke完成的参数转换?
缺乏这一点,我想过对数字类型进行明确的检查,但排列的数量似乎无法实现。当我添加从脚本动态类型提取数字和转换字符串的支持时,情况会变得更糟。我为每个可能的数字目标类设想了一系列条件类型检查,其中Integer.decode,Long.decode等用于Numbers的String参数,Short.decode和Number.intValue,Number.longValue等。
有没有更好的方法来做这件事?起初它似乎是一个很好的方法,但它变得相当糟糕。
约束合理的转换是我的目标,但我要说的却是数字类型是一个区域,它应该是尽可能的灵活,只是管理这些是失控! – 2009-09-29 19:43:08
顺便说一句,谢谢你的想法......我正在看JSPEL规则..当然,这是一个很长的烦人的条件转换列表。叹。哦,我可能可以在写下这个问题的时候写下它。 :-) – 2009-09-29 19:47:50