博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初识反射
阅读量:5756 次
发布时间:2019-06-18

本文共 1014 字,大约阅读时间需要 3 分钟。

#Java类的加载,连接和初始化 当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过加载、连接、初始化三个步骤来对该类进行初始化。当JVM连续完成这三步骤后则称类加载/类初始化完成。

  • 类的加载:由类加载器完成,加载器由JVM提供。还可以通过继承ClassLoader基类来创建自己的类加载器
  • 类的连接:当类被加载后,系统生成一个对应的Class对象,然后进入连接阶段,将会把类的二进制数据合并到JRE中。连接又分为
    1. 验证:检验被加载的类是否有正确的内部结构,并和其他类协调一致
    2. 准备:类准备阶段负责为类的类变量分配内存,并设置默认初始值
    3. 解析:将类的二进制数据中的符号引用替换成直接引用
  • 类的初始化:虚拟机对类进行初始化,主要是对类变量进行初始化 有俩种方式
    1. 声明类变量时指定初始值
    2. 使用静态初始化块为类变量指定初始值
//声明变量a时指定初始值static int a = 9;static int b ;static {      //静态方法块指定变量b的值       b = 3;}复制代码

###类初始化的时机

  • 创建类的实例:就是new一个类
  • 调用某个类的类方法(静态方法)
  • 访问某个类或接口的类变量,或为该类变量赋值
  • 使用反射方式来强制创建某个类或接口对应的java.lang.Class 对象。如Class.forName("person")
  • 初始化某个类的子类。当某个类的子类被初始化,该子类所有的父类都会被初始化
  • 直接使用java.exe命令运行某个之类。当程序运行某个主类,程序会先初始化该主类。

###反射 Java程序运行时都会出现俩种类型:编译时类型运行时类型,Person p = new Strudent(): 运行代码后生成的p变量,编译时类型为Person,运行时类型为Student 当编译时无法预知对象和类可能属于哪些类,程序只能靠运行时信息来发现对象和类的真实信息,这就必须使用反射 ####获得Class对象

  • 使用Class类的forName(String clazzName)静态方法
  • 调用某个类的class属性来获取该类对应的Class对象。例Person.class来获取Person类对应的对象(最安全,性能最好)
  • 调用某个对象的getClass()方法。

转载于:https://juejin.im/post/5a77141bf265da4e732ea3e5

你可能感兴趣的文章
java泛型中特殊符号的含义
查看>>
一秒 解决 ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql 问题
查看>>
Android组件化最佳实践 ARetrofit原理
查看>>
舍弃浮躁, 50条重要的C++学习建议
查看>>
同步手绘板——将View的内容映射成Bitmap转图片导出
查看>>
【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!...
查看>>
微信小程序之wx.navigateback往回携带参数
查看>>
陌陌和请吃饭之类的应用,你要是能玩转,那就厉害了
查看>>
递归的运行机制简单理解
查看>>
汉字转阿斯克马值
查看>>
Java 栈与堆简介
查看>>
【supervisord】部署单进程服务的利器
查看>>
zabbix oracle监控插件orabbix部署安装
查看>>
python3 通过qq 服务器 发送邮件
查看>>
java 多线程踩过的坑
查看>>
部署Replica Sets及查看相关配置
查看>>
倒序显示数组(从右往左)
查看>>
文献综述二:UML技术在行业资源平台系统建模中的应用
查看>>
阿里云服务器 linux下载 jdk
查看>>
Swift 学习 用 swift 调用 oc
查看>>