JavaSE学习笔记-16

反射【重点】

引入反射

反射最重要的思想特点:

配置文件

 使用传统的方法进行访问hi方法

使用反射进行访问hi方法

就是通过配置文件中写了 method=hi,然后把这个method读取出来即可

 但是当我们想要调用cry方法的时候,

 对于传统方法而言,我们就要改变源代码了。就是把

但是对于框架中的源代码我们是不允许直接在源代码上去修改的,,所以这里引入了反射

我们只需要在配置文件上修改就足够了,如图:

 这样就避免了修改源码,在框架的学习中 反射机制真的很重要与必要

反射机制

Java程序在计算机分为三个阶段

 

 

反射的优点和缺点 

 

 显然反射的速度慢了很多

 反射优化:

 但是优化的效果不太明显

 Class类细节注意事项

2.Class类对象不是new出来的,而是系统进行创建的

  

3.

 一个类只可以进行一次加载,这个DOG类只可以进行一次类的加载:

原因:因为在堆空间上只有一份Class类对象,就好像是一个模板一样,无论创建出多少实例引用,但是只有一份Class对象,故只可以加载一次。。。。

哈希值验证这个结论

 一个类对象在堆空间只会有一份,但是不同的类对象在堆空间中就不是同一份了

 

 4.

6.Class对象是存在于堆上的

 7.类的字节码二进制数据是存在于方法区的

一开始我们的Cat.class这个字节码文件先通过类加载器,先把Cat类的字节码二进制数据存放到方法区,之后再加载Class类对象。相比于方法区的字节码的二进制数据,Class类对象更利于去直接进行操作 

 Class对象方法

 获取Class对象的6种方式

 

 

 

类的加载 

 

举例子说明:

静态加载,编译时要加载相关的类:即是如果没有该Dog类的时候,无论是否执行这一块代码,编译时检测就会报错。

 动态加载:反射就是动态加载。编译时不会加载相关的类,只有当运行的时候才会进行类的加载。也就是说,只要不执行这一块代码,无论是否存在Person这个类,编译的时候都不会报错,但是当运行到这里的时候,如果没有Person这个类,那么就一定会报错了,因为运行时会进行类加载

 

类加载的过程 

最终在方法区生成类的字节码二进制数据,在堆区生成类的Class对象,二者存在一个引用 

 方法区即是存放着元数据,即是一些原生态的数据,底层的数据等等。。。

堆区主要是存储着加载出来的数据结构,是数据的访问入口

 

就是静态成员的初始化和类加载有关 

 验证:检验元数据和字节码文件的安全进行检验

准备:对静态变量进行默认初始化[默认初始化即是0或0L或null或false等等]并且分配空间

解析:把符号引用转变为直接引用

 加载和连接这两个阶段是由JVM机控制的,初始化则是可以由程序员来控制的

 加载阶段

连接阶段

 

 

 符合引用就是如图A类和B类,两个相对位置的引用叫做符合引用

但是当JVM虚拟机进行处理之后,在内存中会随机分配地址,那么两个类就可以通过这个地址去进行直接引用

 初始化

 追击源码,正是因为有这个同步锁才会保证一个类只有一份Class对象

 

如果没有new B()这个代码操作,那么就不会执行构造器,只会执行静态变量成员的初始化,因为这是类加载的初始化。如果有new B()这个操作,那么就要执行构造器了哦,,,

常用API

这里的父类表示的意思是:父类,父类的父类,父类的父类的父类,等等直到Object类为止 

 

修正上图第二个API

 

 getType返回的是该属性对应的那个类的Class对象

 

 

通过反射创建对象

Class...clazz:表示可变参数,参数不确定具体有几个

 

 

 

通过反射访问类中的成员

 

因为static表示是静态的成员属性,那么证明它是被所有对象共有的,在类加载的准备阶段分配内存并进行默认初始化,初始化为null,那么可以被null进行代替反射实例化出的对象引用

通过反射访问类中的成员 

 

 练习

·​​​​​​​ 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值