Java内部类反射上的坑

0.166字数 139阅读 705

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));
    }

推荐阅读更多精彩内容