吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 828|回复: 4
收起左侧

[学习记录] Java反射机制

[复制链接]
Kai1222 发表于 2022-4-8 18:45

ReviewDay4

反射

反射机制

  • 反射机制允许程序执行期间借助 Reflection API 获得任何类的内部信息

  • 加载完类之后,堆中就会产生一个Class类型对象一个类只有一个Class对象(包含了类的完整结构信息)

  • 原理示意图

    1.在运行时判断任意一个对象所属的类
    >
    > 2.在运行时构造任意一个类的对象
    >
    > 3.在运行时得到任意一个类所具有的成员变量和方法
    >
    > 4.在运行时调用任意一个对象的成员变量和方法
    >
    > 5.生成动态代{过}{滤}理

反射相关类

  • java.lang.Class

    代表一个类,Class对象表示在某个类加载后在堆中的对象

  • java.lang.reflect.Method

    代表类的成员变量,Method对象表示某个类的方法

  • java.lang.reflect.Field

    代表类的成员变量,Field对象表示某个类的成员变量

  • java.lang.reflect.Constructor

    代表类的构造方法,Constructor对象表示构造器

Class 类

  • 1.Class类也是类,也继承了Object类
  • 2.Class类对象由系统创建(不是new出来的)
  • 3.同一个类的Class类对象,在内存中只有一份,因为类只加载一次
  • 4.每个类的实例都知道自己由哪个Class实例生成的
  • 5.通过Class对象可以得到一个类的完整结构
  • 6.Class对象存放于
  • 7.类的字节码二进制数据存放于方法区(包括方法名,变量名, 方法代码,访问权限)

获取Class类对象

  • 已知一个类的全类名,且该类在类路径下,可以通过Class类的静态方法forName()获取

    eg: Class cls1 = Class.forName("java.lang.Cat");
    >
    > 应用: 多用于配置文件,读取类全路径,加载类

  • 已知具体类,通过类的class方法获取(最安全可靠,性能最高)

    eg: Class cls2 = Cat.class;
    >
    > 应用: 多用于参数传递,比如通过反射达到对应构造器对象

  • 已知某个类的实例,通过该实力的getClass方法获取Class对象

    eg: Class cls3 = cat.getClass(); //运行类型
    >
    > 应用:  通过创建好的对象获取Class对象

  • 其他方式

    ClassLoader cl = 对象.getClass().getClassLoader();
    >
    > Class cls4 = cl.loadClass("类的全类名");

  • 基本数据

    Class cls = 基本数据类型.class

  • 包装类,可以通过.TYPE得到Class类对象

    Class cls = 包装类.TYPE

类加载

1.加载方式
  • 静态加载: 编译时加载相关的类(依赖性强)
  • 动态加载: 运行时再加载需要的类(降低依赖性)
2.类加载时机
  • 创建对象时(new) //静态加载
  • 当子类被加载时,父类也会加载 //静态加载
  • 调用类的静态成员时 //静态加载
  • 反射 //动态加载
3.类加载过程
  • 过程图

  • 各阶段任务

    • 加载阶段:JVM将字节码从不同数据源转化为二进制字节流加载到内存中,并生成Class类对象
    • 连接阶段:验证验证Class文件的字节流信息是否符合虚拟机要求->准备对静态变量分配内存并默认初始化(默认初始值,如0,0L,null, false->解析将常量池中的符号引用替换为直接引用
    • 初始化节点:执行类中定义的Java程序代码(静态变量赋值和静态代码块)
Reflection原理.png
类加载过程.png

免费评分

参与人数 3吾爱币 +1 热心值 +3 收起 理由
abacteria + 1 + 1 谢谢@Thanks!
MHao008 + 1 这两个图画得很棒!
Tonyha7 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Tonyha7 发表于 2022-4-8 19:52
流程图不错 赞一个!
chinaecho 发表于 2022-4-8 22:25
sanyuebeichen 发表于 2022-4-8 22:58
lfm333 发表于 2022-4-9 09:23
学习了,感谢大佬分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 14:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表