Java内部类反射上的坑

java的内部类,使用反射时, 构造器参数会多出外部类的类型作为第一个参数。
具体l例子描述如下:

内部类定义如下:

public class CrawlerSourceConsumer {
    public class KafkaNewsConsumerClient {
        public KafkaNewsConsumerClient(Integer threadSeq, ) {
            ....
        }
.....
}

通过:

List paramClazz = new ArrayList();
paramClazz.add(Integer.class);
Class clazz = KafkaNewsConsumerClient.class;
Constructor constructor = clazz.getConstructor((Class[])paramClazz.toArray(new Class[paramClazz.size()]));

是拿不到构造器的,java反射是通过

private native Constructor[] getDeclaredConstructors0(boolean publicOnly);

拿到的构造器列表, 这是一个native方法。
通过调试可以看到getDeclaredConstructors0拿到的构造器数组包含一个构造器,这个构造器的parameterTypes是:

class  com.XXX.CrawlerSourceConsumer
class  java.lang.Integer

从而与传入的 paramClazz 数组比较,就不会匹配:

    private Constructor getConstructor0(Class[] parameterTypes,
                                        int which) throws NoSuchMethodException
    {
        Constructor[] constructors = privateGetDeclaredConstructors((which == Member.PUBLIC));
        for (Constructor constructor : constructors) {
            if (arrayContentsEq(parameterTypes,
                                constructor.getParameterTypes())) {
                return getReflectionFactory().copyConstructor(constructor);
            }
        }
        throw new NoSuchMethodException(getName() + "." + argumentTypesToString(parameterTypes));
    }

你可能感兴趣的:(Java内部类反射上的坑)