java反射详解

一,反射简介
Class类与java.lang.reflect库一起对反射的概念进行了支持,该类库包含了Field,Method及Constructor。这些类型的对象是由JVM在运行时创建的。这样你就可以使用Constructor创建新的对象,用get()和set()读取和修改与Field对象关联的字段,用invoke()方法调用与Method对象关联的方法。另外还可以调用getField(),getMethods()和getConstructors()等很便利的方法,以返回表示字段,方法以及构造器的对象的数组。
二,Class对象(重点)
每当我们编写并编译一个类时,就会产生一个class对象(更恰当地说,是保存在同名的.class文件中),虚拟机把这些描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。
当程序创建第一个对类的静态引用时,就会加载这个类。构造器也是对类的静态方法。

获取Class引用有以下三种方法
1,getClass() 这个方法属于根类Object的一部分,它将返回表示该对象的实际类型的Class引用。
2,Class.forName() 这个方法里面的字符串必须是类的全限定名(即包含包名) 此处有一点需要注意,调用这个方法获取Class引用时,如果类还没有加载,就必须先加载它
3,类字面常量
类字面常量即类名.class。对于基本类型如int.class。当使用".class"来创建对Class对象的引用时,不会自动地初始化该Class对象。
类加载的过程,分为加载,验证,准备,解析,初始化这5个阶段。其中验证,准备,解析统称为连接。各个阶段功能阐述如下
一,加载
这是由类加载器执行的,这一过程的主要功能是在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
二,验证
验证是连接阶段的第一步,这一阶段的目的是确保Class文件的字节流中包含的信息符合当前虚拟机的要求,不会危害虚拟机自身安全。因为Class文件并不一定要求用java源码编译而来,可以使用任何途径产生。虚拟机如果不检查自身输入的字节流,对其完全信任,很可能会因为载入了有害的字节流而导致系统崩溃。
三,准备
准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在内存实例化时随着对象一起分配在堆中。
四,解析
简单来说,这个阶段主要是解析这个类创建的对其他类的所有引用。《深入理解java虚拟机》一书中是这样描述的,解析阶段是将常量池内的符号引用替换为直接引用的过程。
符号引用:以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。
直接引用:直接引用可以是直接指向目标的指针,相对偏移量或是一个能间接定位到目标的句柄。
五,初始化
对于初始化阶段,虚拟机规范严格规定了有且只有5种情况必须立即对类进行初始化。
1,使用new关键字,读取或设置类的静态字段(被final修饰的静态常量除外,它在编译期结果已经被放入常量池),调用类的静态方法的时候。
2,使用java.lang.reflect包的方法对类进行反射调用的时候,如果没有初始化则必须先初始化。
3,当初始化一个类的时候,如果发现父类还没有初始化,则需要先触发其父类初始化。
4,虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。
5,(没看懂。。。暂时略过。。。)
三,补充
Class.isInstance方法提供了一种动态测试对象的路径。
Class.isAssignableFrom则可以判断是否是同一种Class引用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值