Java类型信息

识别对象和类的信息的两种方式:

         RIIT:在编译时就已经知道了所有的类型

         反射:允许我们在运行时发现和使用类的信息

RIIT:

Class类和累加载器:

  Class类:每个类都有一个class对象(每当编译了一个新类就会产生一个class对象,更恰当的说是被保存在同名的.class文件        中),他包含了与类有关的信息,可如下方法获得class对象

//该方法可能导致找不到类的异常,不安全,且会加载该类
Class class1=Class.forname("Test");
//即类字面常量,该方法在编译时就已经进行检查,所以不会像上面的方法导致异常,使用该方法创建类对象暂时不加载类
Class class2=Test.class;

    泛化的Class引用:Class<?> 比单纯的class要更合适,因为他表面你不是因为一时的疏忽才没有指定class所能引用的类型,而是故意如此做的

//泛化的class限定了class引用所能指向的对象
Class<Test> class;

//假定有一个基类building,和继承自building的house类
//如果想class引用能同时引用上面两个对象,则应该
Class<T extends building> class;

 

类加载器:类加载器子系统可以包含一条类加载器链(额外的类:比如你有特殊的需求(从网络下载类之类的需求)),但是只有一个原生加载器(加载可信类,通常从本地加载),但使用类时,类加载器先检查该类是否已经被加载,如果还没有加载则通过查找字节码,并从这些字节码中创建一个class对象

 java加载类的过程:java的类加载是懒加载的方式(初始化被延迟到了对静态方法(构造器其实也是静态方法)或非常数静态域的首次引用才执行)

     过程:

              1.加载:由加载器执行,查找该类的字节码,并从这些字节码中生成一个class对象

              2.连接:验证类中的字节码,为静态域分配存储空间,并且如果必须的话将解析这个类创建的对其它类的所有引用

              3.初始化:如果该类存在超类,则对其初始化,执行静态初始化器和静态初始化块。

     注意:如果被引用的静态成员是“编译器常量”则不需要对类进行初始化就可以被读取

//以下只有staticFinal1是“编译期常量”
static final int staticFinal1=47;
static final int staticFinal2=ClassInitalization.rand.nextInt(1000);
static int staticFinal3=147;

 

反射:通过class.forname()方法获得该类对象的引用,并获得Constructor对象(构造器)和Method对象(方法),以此创建新的对象和调用方法

 

 

 

 

            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值