Java基础18(类加载、反射和动态代理)
文章目录
- 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主动使用某个类,且该类还未被加载到内存中,系统就会通过加载、连接、初始化三步来把该类加载到内存。
- 加载:将类的
.class
文件读入到内存,并为其创建一个java.lang.Class
对象。 - 连接:把类的二进制数据合并到JRE中。该阶段又分为验证、准备、解析。
- 初始化:对类的静态属性进行初始化。
1.2.1 JVM什么时候加载某个类
当程序通过以下六种方式来使用某个类或者接口时,JVM主动加载该类或者接口:
- 创建类的对象。有通过new操作符来创建对象,通过反射创建对象,通过反序列化创建对象。
- 调用某个类的静态方法
- 调用某个类的静态属性,或者为该属性赋值。
- 通过反射方式强制创建某个类或者接口对应的
java.lang.Class
对象。比如前面的Class.forName("com.mysql.jdbc.Driver")
,如果JVM还未加载Driver
类,这段代码就会将该类初始化,并返回Driver类对应的java.lang.Class对象。 - 初始化某个类的子类。当JVM需要初始化某个类的,其所有的父类都会被初始化。
- 直接使用java.exe来运行某个主类,JVM会初始化该主类。
1.2.2 类加载器加载类
类的加载由类加载器完成。
类加载器加载二进制数据来源:
- 本地文件系统来加载class文件
- 从jar包中加载class文件。通常是我们使用非jdk提供的类,比如使用JDBC要用到的mysql驱动。
- 通过网络加载(我用的比较少)
- 把一个Java源文件动态编译、并加载
类加载器加载类的时机:看JVM的设置
1.2.3 连接
连接负责将类的二进制数据合并到jre中。整个过程分为三步:
- 验证:检测被加载的类是否有正确的内部结构,并且和其他类协调一致。
- 准备:负责为类的静态属性分配内存,并且设置默认初始值。
- 解析:将类的二进制数据中的符号引用替换为直接引用。(这里不太懂)
1.2.4 类的初始化
2. 反射
2.1 获得类的Class对象
每个类被加载后,系统会为该类生成一个对应的Class对象。获取Class对象的方式有:
- 使用Class的
forName()
静态方法。参数为类的全限定类名的字符串。 - 调用某个类的class属性。如
Person.class
的值就是Person对应的Class对象。 - 调用对象的
getClass()
方法。
2.2 从Class对象中获取信息
获取构造器:
Connstructor<T> getConstructor(Class<?>... parameterTypes)
:
Java基础18(类加载、反射和动态代理)相关推荐
- Java提高班(六)反射和动态代理(JDK Proxy和Cglib)
反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...
- java底层 —反射、动态代理
java底层 -反射.动态代理和注解 1. 反射介绍 1.1 反射 反射是指程序可以访问,检测,修改它本身状态或行为的一种能力. 1.2 java的反射机制 java的反射机制是指在程序运行状态中,给 ...
- 死磕java底层(三)—反射、动态代理和注解
1.反射介绍 1.1反射 反射是指程序可以访问,检测,修改它本身状态或行为的一种能力. 1.2java的反射机制 java的反射机制是指在程序运行状态中,给定任意一个类,都可以获取到这个类的属性和方法 ...
- throwable四参构造_深入分析Java反射(四)-动态代理
动态代理的简介 Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分 ...
- Java基础10(反射)
Java基础10(反射) 1 什么是反射 官方解释:反射(reflection)技术通常被用来检测和改变应用程序在 Java 虚拟机中的行为表现.它是一个相对而言比较高级的技术,反射是一种强有力的技术 ...
- Java基础:类加载器
系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 什么是类加载器 类加载器就是用来加载类的东西!类加载器也是一个类:ClassLoader 类加载 ...
- Java基础13:反射与注解详解
Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...
- 深圳Java培训:Spring框架之动态代理
深圳Java培训:Spring框架之动态代理 前言 动态代理是一种常用的设计模式,广泛应用于框架中,Spring框架的AOP特性就是应用动态代理实现的,想要理解AOP的实现原理我们就必须先理解动态代理 ...
- Android APP热更新中的插件化(Hook技术:反射或动态代理),Demo (2)
修改AAPT,资源分区,用于Android插件化- https://github.com/BaoBaoJianqiang/AAPT -- Android下的挂钩(hook)和代码注入(inject) ...
- Java基础-注解和反射
Java基础-注解和反射 前言 对于注解,我主要还是在自定义APT还有运行时反射获取类来让自己能够构建出复用性更高的代码逻辑. 知识点1-注解: 注解的应用场景由元注解@Retention来进行指定, ...
最新文章
- freemarker-ide eclipse安装地址 安装方法 页面静态化
- SQL output子句的用法
- Java 向上类型转换与向下类型转换的理解【复习】
- 逻辑分析仪抓取CAN总线数据
- Java命令行界面(第26部分):CmdOption
- ES6笔记 -- 字符串拓展
- ckeditor java 上传_java使用CKEditor实现图片上传功能
- 从程序员到项目经理(9):程序员加油站 -- 再牛也要合群【转载】
- Jmeter(一)http接口添加header和cookie
- java制作一个简单的画板_【Java】Thymeleaf一个简单示例
- nagios监控mysql主从
- day23 内置函数,匿名函数,递归
- xgboost算法原理_从XGB到SecureBoost:看联邦学习XGB的算法原理
- MS SQL SERVER中的临时表
- php$.ajax(),使用PHP的jQuery $.ajax()
- 单片机-控制-伺服电机-舵机
- linux cxf服务端,Apache CXF 框架应用实战
- 华为笔记本linux版电脑管家,一键全解决 华为MateBook电脑管家让您告别电脑烦恼...
- 一台电脑实现Kvaser CAN总线理论实践、开发与测试!
- 8.2.1-elasticsearch内置分词器之standard/simple
热门文章
- mysql数据对比同步_跨数据库mysql语句同步数据和对比运算
- mac 黑窗口连接mysql_Mac系统Python、PyCharm安装及使用方法详解
- 配置一个Servlet可以被一个(指定的开头链接,后自定义)访问
- java+synchro_synchrozied,wait()与notify()的理解
- mysql 存储过程 select 循环_简简单单储存过程——循环一个select结果集
- 可以节约很多代码的几个正则表达式
- scipy和statsmodels处理回归
- 从多篇2021年顶会论文看多模态预训练模型最新研究进展
- 直播 | CMU博士后刘鹏飞:文本生成任务十大发展趋势(2020-2021)
- L2正则没有想象那么好?可能是“权重尺度偏移”惹的祸