我有一个通用的回调对象,它为 Java 提供(原始)回调功能,在没有闭包的情况下。Callback 对象包含一个 Method,并通过几个访问器方法返回该方法的参数和返回类型,这些访问器方法只是委托给 Method 中的等效方法。
我正在尝试验证为我提供的回调是否指向有效方法。我需要与 Number 兼容的返回类型赋值以及与 Double 兼容的所有参数。我的验证方法如下所示:
static public void checkFunctionSpec(Callback cbk) {
Class[] prms=cbk.getParmTypes();
Class ret =cbk.getReturnType();
if(!Number.class.isAssignableFrom(ret)) {
throw new IllegalArgumentException(
"A function callback must return a Number type " +
"(any Number object or numeric primitive) - function '" +
cbk + "' is not permitted");
}
for(Class prm: prms) {
if(!Double.class.isAssignableFrom(prm)) {
throw new IllegalArgumentException(
"A function callback must take parameters of " +
"assignment compatible with double " +
"(a Double or Float object or a double or float primitive) " +
"- function '" + cbk + "' is not permitted");
}
}
}
我遇到的问题是,当我尝试使用例如 Math.abs() 时,它会为返回类型抛出异常,如下所示:
java.lang.IllegalArgumentException:
A function callback must return a Number type (any Number object or numeric primitive)
- function 'public static double java.lang.Math.abs(double)' is not permitted
这让我感到惊讶,因为我希望原语能够简单地工作,因为 (a) 它们使用它们的包装类来反映,并且 (b) Double.TYPE 被声明为 Class<Double> 类型。
有谁知道我如何在不修改我的支票的情况下实现这一目标:
if(!Number.class.isAssignableFrom(ret)
&& ret!=Double.TYPE
&& ret!=Float.TYPE
&& ret!=...) {
澄清
当您double abs(double)
使用 Method.invoke() 调用该方法时,您传入一个 Object[]{Double} 并返回一个 Double。但是,我的验证似乎失败了,因为 Double.TYPE 不能分配给 Double。由于我要求所有这些回调返回某种数字,这将由 invoke() 作为数字返回,因此我试图验证提供的方法是否返回数字或数字原语。
参数的验证也是如此。
换句话说,当使用反射时,参数和返回类型 Double 和 double 是相同的,我想这样轻松地验证它们。
编辑:进一步澄清:我想验证一个方法是否会在调用 invoke() 时返回一个 Number 类型的对象(我可以从中调用 obj.doubleValue() 来获得我想要的双精度)。