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类型。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值