java的内部类,使用反射时, 构造器参数会多出外部类的类型作为第一个参数。
具体l例子描述如下:
内部类定义如下:
public class CrawlerSourceConsumer {
public class KafkaNewsConsumerClient {
public KafkaNewsConsumerClient(Integer threadSeq, ) {
....
}
.....
}
通过:
List<Class> paramClazz = new ArrayList();
paramClazz.add(Integer.class);
Class<T> clazz = KafkaNewsConsumerClient.class;
Constructor constructor = clazz.getConstructor((Class[])paramClazz.toArray(new Class[paramClazz.size()]));
是拿不到构造器的,java反射是通过
private native Constructor<T>[] getDeclaredConstructors0(boolean publicOnly);
拿到的构造器列表, 这是一个native方法。
通过调试可以看到getDeclaredConstructors0
拿到的构造器数组包含一个构造器,这个构造器的parameterTypes
是:
class com.XXX.CrawlerSourceConsumer
class java.lang.Integer
从而与传入的 paramClazz
数组比较,就不会匹配:
private Constructor<T> getConstructor0(Class<?>[] parameterTypes,
int which) throws NoSuchMethodException
{
Constructor<T>[] constructors = privateGetDeclaredConstructors((which == Member.PUBLIC));
for (Constructor<T> constructor : constructors) {
if (arrayContentsEq(parameterTypes,
constructor.getParameterTypes())) {
return getReflectionFactory().copyConstructor(constructor);
}
}
throw new NoSuchMethodException(getName() + ".<init>" + argumentTypesToString(parameterTypes));
}