gpt4 book ai didi

java - 验证 Java 中反射方法的返回类型和参数

转载 作者:行者123 更新时间:2023-12-02 08:38:39 26 4
gpt4 key购买 nike

我有一个通用的 Callback 对象,它在没有闭包的情况下为 Java 提供(原始)回调功能。 Callback 对象包含一个 Method,并通过几个访问器方法返回该方法的参数和返回类型,这些访问器方法仅委托(delegate)给 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)它们使用其包装类来反射(reflect),并且(b)Double.TYPE 被声明为 Class 类型。

有谁知道我如何在不修改我的支票的情况下实现这一目标:

if(!Number.class.isAssignableFrom(ret)
&& ret!=Double.TYPE
&& ret!=Float.TYPE
&& ret!=...) {
<小时/>

澄清

当您使用 Method.invoke() 调用方法 double abs(double) 时,您传入一个 Object[]{Double} 并返回一个 Double。但是,我的验证似乎失败,因为 Double.TYPE 不可分配给 Double。由于我要求所有这些回调返回某种数字,该数字将由 invoke() 作为数字返回,因此我试图验证提供的方法是否返回 Number 或数字基元。

参数的验证同样如此。

换句话说,当使用反射时,parm 和返回类型 Double 和 double 是相同的,我想轻松地验证它们。

编辑:为了进一步澄清:我想验证一个方法在调用 invoke() 时会返回一个 Number 类型的对象(我可以从中调用 obj.doubleValue() 来获取我想要的 double 值)。

最佳答案

仔细查看 Class.isAssignableFrom() 的文档,它特别指出,基元的类型与除自身之外的任何类都不匹配。因此,我需要专门检查返回类型的 == 是否等于 Byte.TYPE、Double.TYPE、Float.TYPE、Integer.TYPE、Long.TYPE 和 Short.TYPE。

关于java - 验证 Java 中反射方法的返回类型和参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/410343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com