Java 如何使用反射调用varargs中包含null的方法

Java 如何使用反射调用varargs中包含null的方法,java,reflection,Java,Reflection,我所处的情况就像一个类包含相同的方法名,我们试图使用反射来调用,但当其中一个参数包含null时,似乎出现了问题 例如: 包装试验; 公共类调用程序{ 公共无效测试(字符串a,整数b){ System.out.println(“字符串,整数”); } 公共无效测试(整数a、整数b){ System.out.println(“整数,整数”); } 公共void调用(字符串方法名、对象…参数){ 试一试{ Class[]clazz=新类[args.length]; int i=0; 用于(对象a:a

我所处的情况就像一个类包含相同的方法名,我们试图使用反射来调用,但当其中一个参数包含null时,似乎出现了问题

例如:


包装试验;
公共类调用程序{
公共无效测试(字符串a,整数b){
System.out.println(“字符串,整数”);
}
公共无效测试(整数a、整数b){
System.out.println(“整数,整数”);
}
公共void调用(字符串方法名、对象…参数){
试一试{
Class[]clazz=新类[args.length];
int i=0;
用于(对象a:args){
clazz[i++]=a!=null?a.getClass():null;
}
方法m=this.getClass().getMethod(方法名,clazz);
//…继续调用
}捕获(例外e){
e、 printStackTrace();
}
}
公共静态void main(字符串…参数){
Invoker Invoker=新的Invoker();
//有时碰巧是空的
字符串a=null;
整数b=123;
System.out.println(“正常触发”);
调用方测试(a,b);
System.out.println(“通过反射触发”);
调用程序。调用(“测试”,a,b);
}
}
结果

Trigger Normally
String, Integer
Trigger via Reflection
java.lang.NoSuchMethodException: test.Invoker.test(null, java.lang.Integer)
    at java.lang.Class.getMethod(Class.java:1678)
    at test.Invoker.invoke(Invoker.java:21)
    at test.Invoker.main(Invoker.java:42)

参数有时碰巧为null,但如果为null,则会触发
NoSuchMethodException

我们的方法名不是唯一的,它必须是重载结构。

因为被调用的重载方法是在编译时确定的(或者如果不能确定,您将得到编译时错误)。由于您有
stringa=null
,编译器可以确定您想要调用
test(String,Integer)

您的反射调用发生在运行时,并且缺少
null
参数中的类型信息(方法不知道它起源于
字符串a
,编译器在编译时知道,但这是运行时),因此您需要提供它是null
字符串
还是
整数
的信息

如果希望反射方法使用null值(和重载方法),则需要添加一个单独的类型参数以用于null。比如说

invoker.invoke("test", a, String.class, b, Integer.class);

如果没有额外的类型信息,您无法让它为null工作,因为这就像调用
test(null,1)
。在这种情况下,编译器也需要您的帮助,例如
test((整数)null,1)
test((字符串)null,1)
,请尝试一下。

hm。。。我不能强制我的团队成员在试图调用时指定每一个类和参数,这就是为什么我认为有什么优雅的方法可以实现这一点。@DataFeed反射不应该真正用作通用工具。你为什么决定在这里使用反射?你到底想做什么?