java反射之超类型限定?super

package com.test.testClass;

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        Class<TonyToy> cls = TonyToy.class;
        TonyToy tonyToy = cls.newInstance();
        Class<? super TonyToy> cls1 = cls.getSuperclass();
        Object object = cls1.newInstance();
    }
}

class TonyToy {

}

1 TonyToy.class -> 生成Class对象,同时泛化为TonyToy类。

(.class 生成Class对象,然后使用该对象。这分为三步:加载,链接,初始化。加载:由类的加载器执行,查找相关字节码,然后生成Class对象。链接:验证字节码,为静态域分配存储空间。初始化:如果该类由超类,进行初始化,执行静态初始化块和静态初始化器。)(final static修饰的属性,可以不用初始化,直接读取其值。)

2.下一句:cls.newInstance() 则创建了一个TonyToy的实例。

cls需要一个空构造器来创建这个实例,若没有则会报异常。

3.我们想过cls,也就是TonyToy来创建它的父类对象。我们可以看到<>里是? super TonyToy  

我们先不考虑这个。假设有一个TonyToy有一个Toy父类。那么,在<>里,我该写Toy吗?答案是不能这么写。

因为Class的不确定性, 导致我们明面上不能直接写Toy,而是应该写 ? super TonyToy ,这样,即使程序中没有TonyToy的父类存在,也会创建一个TonyToy的父类,然后创建一个实例。反射不管你程序中有没有指定父类。它都会通过? super TonyToy,这种形式,来代表TonyToy的父类。父类的不确定性,导致假设它的直接父类是Object,所以newInstance()返回的是Object类型。

猜你喜欢

转载自blog.csdn.net/qq_34561892/article/details/82941170