文章目录

  • 1 类是如何从.class文件到JVM可以使用
    • 1.1 JVM
    • 1.2 JVM加载类
      • 1.2.1 JVM什么时候加载某个类
      • 1.2.2 类加载器加载类
      • 1.2.3 连接
      • 1.2.4 类的初始化
  • 2. 反射
    • 2.1 获得类的Class对象
    • 2.2 从Class对象中获取信息

1 类是如何从.class文件到JVM可以使用

1.1 JVM

当我们启动某个Java程序时,将会在系统中启动一条Java虚拟机进程,不管该Java程序有多复杂,它们都处于这个Java虚拟机中。

JVM进程终止的情况:

  • 程序正常结束。
  • 程序运行到System.exit()或者Runtime.getRuntime().exit()代码结束。
  • 程序运行过程中遇到未被捕获的异常或者错误,程序结束。
  • JVM运行的平台强制结束了JVM进程。比如linux下用kill命令强制结束某个进程。

1.2 JVM加载类

当JVM主动使用某个类,且该类还未被加载到内存中,系统就会通过加载、连接、初始化三步来把该类加载到内存。

  1. 加载:将类的.class文件读入到内存,并为其创建一个java.lang.Class对象。
  2. 连接:把类的二进制数据合并到JRE中。该阶段又分为验证、准备、解析。
  3. 初始化:对类的静态属性进行初始化。
1.2.1 JVM什么时候加载某个类

当程序通过以下六种方式来使用某个类或者接口时,JVM主动加载该类或者接口:

  1. 创建类的对象。有通过new操作符来创建对象,通过反射创建对象,通过反序列化创建对象。
  2. 调用某个类的静态方法
  3. 调用某个类的静态属性,或者为该属性赋值。
  4. 通过反射方式强制创建某个类或者接口对应的java.lang.Class对象。比如前面的Class.forName("com.mysql.jdbc.Driver"),如果JVM还未加载Driver类,这段代码就会将该类初始化,并返回Driver类对应的java.lang.Class对象。
  5. 初始化某个类的子类。当JVM需要初始化某个类的,其所有的父类都会被初始化。
  6. 直接使用java.exe来运行某个主类,JVM会初始化该主类。
1.2.2 类加载器加载类

类的加载由类加载器完成。

类加载器加载二进制数据来源:

  • 本地文件系统来加载class文件
  • 从jar包中加载class文件。通常是我们使用非jdk提供的类,比如使用JDBC要用到的mysql驱动。
  • 通过网络加载(我用的比较少)
  • 把一个Java源文件动态编译、并加载

类加载器加载类的时机:看JVM的设置

1.2.3 连接

连接负责将类的二进制数据合并到jre中。整个过程分为三步:

  1. 验证:检测被加载的类是否有正确的内部结构,并且和其他类协调一致。
  2. 准备:负责为类的静态属性分配内存,并且设置默认初始值。
  3. 解析:将类的二进制数据中的符号引用替换为直接引用。(这里不太懂)
1.2.4 类的初始化

2. 反射

2.1 获得类的Class对象

每个类被加载后,系统会为该类生成一个对应的Class对象。获取Class对象的方式有:

  1. 使用Class的forName()静态方法。参数为类的全限定类名的字符串。
  2. 调用某个类的class属性。如Person.class的值就是Person对应的Class对象。
  3. 调用对象的getClass()方法。

2.2 从Class对象中获取信息

获取构造器:

  1. Connstructor<T> getConstructor(Class<?>... parameterTypes)

Java基础18(类加载、反射和动态代理)相关推荐

  1. Java提高班(六)反射和动态代理(JDK Proxy和Cglib)

    反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...

  2. java底层 —反射、动态代理

    java底层 -反射.动态代理和注解 1. 反射介绍 1.1 反射 反射是指程序可以访问,检测,修改它本身状态或行为的一种能力. 1.2 java的反射机制 java的反射机制是指在程序运行状态中,给 ...

  3. 死磕java底层(三)—反射、动态代理和注解

    1.反射介绍 1.1反射 反射是指程序可以访问,检测,修改它本身状态或行为的一种能力. 1.2java的反射机制 java的反射机制是指在程序运行状态中,给定任意一个类,都可以获取到这个类的属性和方法 ...

  4. throwable四参构造_深入分析Java反射(四)-动态代理

    动态代理的简介 Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分 ...

  5. Java基础10(反射)

    Java基础10(反射) 1 什么是反射 官方解释:反射(reflection)技术通常被用来检测和改变应用程序在 Java 虚拟机中的行为表现.它是一个相对而言比较高级的技术,反射是一种强有力的技术 ...

  6. Java基础:类加载器

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 什么是类加载器 类加载器就是用来加载类的东西!类加载器也是一个类:ClassLoader 类加载 ...

  7. Java基础13:反射与注解详解

    Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...

  8. 深圳Java培训:Spring框架之动态代理

    深圳Java培训:Spring框架之动态代理 前言 动态代理是一种常用的设计模式,广泛应用于框架中,Spring框架的AOP特性就是应用动态代理实现的,想要理解AOP的实现原理我们就必须先理解动态代理 ...

  9. Android APP热更新中的插件化(Hook技术:反射或动态代理),Demo (2)

    修改AAPT,资源分区,用于Android插件化- https://github.com/BaoBaoJianqiang/AAPT -- Android下的挂钩(hook)和代码注入(inject) ...

  10. Java基础-注解和反射

    Java基础-注解和反射 前言 对于注解,我主要还是在自定义APT还有运行时反射获取类来让自己能够构建出复用性更高的代码逻辑. 知识点1-注解: 注解的应用场景由元注解@Retention来进行指定, ...

最新文章

  1. freemarker-ide eclipse安装地址 安装方法 页面静态化
  2. SQL output子句的用法
  3. Java 向上类型转换与向下类型转换的理解【复习】
  4. 逻辑分析仪抓取CAN总线数据
  5. Java命令行界面(第26部分):CmdOption
  6. ES6笔记 -- 字符串拓展
  7. ckeditor java 上传_java使用CKEditor实现图片上传功能
  8. 从程序员到项目经理(9):程序员加油站 -- 再牛也要合群【转载】
  9. Jmeter(一)http接口添加header和cookie
  10. java制作一个简单的画板_【Java】Thymeleaf一个简单示例
  11. nagios监控mysql主从
  12. day23 内置函数,匿名函数,递归
  13. xgboost算法原理_从XGB到SecureBoost:看联邦学习XGB的算法原理
  14. MS SQL SERVER中的临时表
  15. php$.ajax(),使用PHP的jQuery $.ajax()
  16. 单片机-控制-伺服电机-舵机
  17. linux cxf服务端,Apache CXF 框架应用实战
  18. 华为笔记本linux版电脑管家,一键全解决 华为MateBook电脑管家让您告别电脑烦恼...
  19. 一台电脑实现Kvaser CAN总线理论实践、开发与测试!
  20. 8.2.1-elasticsearch内置分词器之standard/simple

热门文章

  1. mysql数据对比同步_跨数据库mysql语句同步数据和对比运算
  2. mac 黑窗口连接mysql_Mac系统Python、PyCharm安装及使用方法详解
  3. 配置一个Servlet可以被一个(指定的开头链接,后自定义)访问
  4. java+synchro_synchrozied,wait()与notify()的理解
  5. mysql 存储过程 select 循环_简简单单储存过程——循环一个select结果集
  6. 可以节约很多代码的几个正则表达式
  7. scipy和statsmodels处理回归
  8. 从多篇2021年顶会论文看多模态预训练模型最新研究进展
  9. 直播 | CMU博士后刘鹏飞:文本生成任务十大发展趋势(2020-2021)
  10. L2正则没有想象那么好?可能是“权重尺度偏移”惹的祸