java的內(nèi)部類孽尽,使用反射時(shí)窖壕, 構(gòu)造器參數(shù)會(huì)多出外部類的類型作為第一個(gè)參數(shù)。
具體l例子描述如下:
內(nèi)部類定義如下:
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()]));
是拿不到構(gòu)造器的杉女,java反射是通過
private native Constructor<T>[] getDeclaredConstructors0(boolean publicOnly);
拿到的構(gòu)造器列表瞻讽, 這是一個(gè)native方法。
通過調(diào)試可以看到getDeclaredConstructors0
拿到的構(gòu)造器數(shù)組包含一個(gè)構(gòu)造器宠纯,這個(gè)構(gòu)造器的parameterTypes
是:
class com.XXX.CrawlerSourceConsumer
class java.lang.Integer
從而與傳入的 paramClazz
數(shù)組比較卸夕,就不會(huì)匹配:
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));
}