学习类型信息

类型信息

java提供两种在运行时识别对象和类的信息的方法。主要有两种方式:一种编译时就知道类型信息;一种利用“反射机制”让我们在运行时知道类型信息。

 

Class对象

Class对象就是用来创建类的所有对象的。



反射:运行时的类型信息

Class类与java.lang.reflect类库一起对反射的概念进行了支持,该类库中包含了Field、Method、以及Constructor类(每个类都实现了Member接口) 。这些类型的对象都是有JVM在运行时创建的,用以表示未知类里对应成员

       

动态代理

Java的动态代理笔袋里的思想更向前迈进了一部,因为他可以动态的创建代理并动态的处理对所代理方法的调用。在动态代理商所做的所有调用都会被重定向到单一的调用处理器上,他的工作是解释调用类型并确定相应的对策。

 

Java RTTI(rumtime type info)用于在运行时识别对象的类型信息。java虚拟机不能在运行时加载所有类型对象(动态加载),同时部分类型的信息是无法再编译器就获取的,需要在业务逻辑中依据类型信息进行相关逻辑的处理,这是就需要RTTIl了。

使用Class的newInstance方法可以创建class对应对象,但前提是对应类有默认构造函数(无参构造函数)。

       java程序在他开始运行之前并非被完全加载,其各个部分是在必需时才加载的。类加载器首先检查这个类是否被加载。如果尚未加载,默认的类加载器就会根据类名查找.class文件。在这个类的字节码被加载时,他们会接受验证,以确保其没有被破坏,并且不包含不良java代码。

使用类的准备工作实际包含三个步骤

1)加载,这是由类加载器执行的。该步骤将查找字节码(通常classpathsuo指定的路径中查找,但是这并非是必需的),并且从这些字节码中创建一个Class对象。

2)连接。在连接阶段将验证类中的字节码,为静态域分配存储空间,并且如果必需的话将解析这个类创建的对其他类的所有引用。

3)初始化。如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。

final static成员和static成员的在以上三个过程中就不一样,final static成员被称为“编译器常量”,在编译时已经被赋值,所以可以在类加载前就进行访问,而静态成员(非final)需要在类加载后、class对象初始化之后赋值。

 

finnal static与static区别

static finnal值是“编译器常量”这个值不需要对类进行初始化就可以被读取。

static域不是final的那么他在被访问是,总是要求在他被读取之前,先进行连接(为这个域分配存储空间)和初始化改存储空间。

 

instanceof与Class的等价性

instanceof作为参数来执行类型检查。它保持了类型的概念,它指的是“你是这个类吗,或者你这个类时派生类吗?”而如果使用==比较实际的Class对象就没有考虑到继承。

java内存为堆(heap)、方法区域(method area)、java栈(java stack)、程序计数注册器(program counter register)、本地方法栈(native method stack)。对象的类型信息就存储在method area中,且不会有垃圾回收器进行垃圾回收。因此,如果设置的method area区域较少时,就回出现内存溢出问题(对象的error message是: java.lang.OutOfMemoryError: PermGen space),对应的JVM设置参数是:-xx:MaxPermSize=512m。

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值