Java进阶 - [1-4] 反射
一、类加载区别
当我们刚接触java语言的时候,我们最常见的代码应该就是初始化某个对象,然后调用该对象的方法。
1、使用new创建对象,返回对象的引用。Student student = new Student();
2、调用方法:student.say();
当我们想在运行期才能指定具体对象的类型或调用的某个方法、属性时,普遍的编码方式将无法实现需求。
反射可以在运行期指定具体对象的类型以及调用某个方法、属性。
1、通过类名加载类 Class personClass = Class.forName("com.harley.Person");
2、获取构造器 Constructor constructor = personClass.getConstructor();
3、使用构造器获取实例对象 Person person = (Person) constructor.newInstance();
二、JVM类加载流程和内存结构

Step1:类编译器将java源文件
.java编译为class文件.classStep2:类加载器ClassLoader对class文件加载(加载、验证、准备、解析、初始化)到JVM
Step3:内存中分为JVM内存管理、本地内存
Step4:JVM内存管理分为
- 线程私有
- 程序计数器
- 本地方法栈:管理native方法的执行
- 虚拟机栈:栈帧(局部变量表、操作数栈、动态链接、方法出口)
Student student- 线程公有
- 方法区:类信息、常量、静态变量、即时编译器编译后的代码
- java堆:Student实例对象
Step5:JVM垃圾回收线程公有以及本地内存到老年代。
Step6:堆内存=Eden内存 + S0/S1内存 + 老年代内存
三、Class文件包含的内容
Class文件中,几乎包含了所有类相关的信息,如:类名、包名、属性、方法等等。
四、创建实例对象的步骤对比
获得对象实例无论是使用new对象的方式,还是使用反射的方式,大致都是需要以下3步,即:
1、加载Class文件
2、查找入参匹配的构造函数
3、通过构造函数创建实例对象

五、反射相关的操作
- 通过无参构造函数创建实例对象
- 通过有参构造函数创建实例对象
- 反射通过私有构造函数创建对象,破坏单例模式
- 通过反射获得类的public属性值,演示getField与getDeclaredField两者的区别
- 通过反射获得类的private、protected、默认访问修饰符的属性值
- 通过反射获得类的private方法
- 我们采用反射机制来实现一个工具BeanUtils,可以将一个对象属性相同的值赋值给另一个对象。
- 通过mapstruct实现两个实体间的属性值复制
— 要养成终生学习的习惯 —
Java进阶 - [1-4] 反射的更多相关文章
- Java进阶之reflection(反射机制)——反射概念与基础
反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...
- JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践
JAVA进阶之旅(二)--认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践 我们继续聊JAVA,这次比较有意思,那就是反射了 一.认识 ...
- JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法
JAVA进阶之旅(一)--增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法 学完我们的java之旅,其实收获还是很多的,但是依然还有很 ...
- Java进阶(二十五)Java连接mysql数据库(底层实现)
Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...
- Scala进阶之路-反射(reflect)技术详解
Scala进阶之路-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala中的反射技术和Java反射用法类似,我这里就不一一介绍反射是啥了,如果对 ...
- Java进阶之路
Java进阶之路——从初级程序员到架构师,从小工到专家. 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序 ...
- Java进阶2 数组内存和对象的内存管理知识
Java进阶2 数组内存和对象的内存管理知识 20131028 前言: 在面试的时候,如果是Java的编程语言,也许你认为没有什么可以问的,只能够说明你对于Java了解的太浅了,几乎就是两个星期的节奏 ...
- Java进阶
Java进阶(一)Annotation(注解) Java进阶(二)当我们说线程安全时,到底在说什么 Java进阶(三)多线程开发关键技术 Java进阶(四)线程间通信方式对比 Java进阶(五)NIO ...
- Java进阶教程:使用Lombok提升开发效率
Java进阶教程:使用Lombok提升开发效率 Lombok Lombok是一种Java™实用工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO).它通过注释实现这 ...
- java进阶视频分享
更多资源和教程请关注公众号:非科班的科班. 如果觉得我写的还可以请给个赞,谢谢大家,你的鼓励是我创作的动力 课程目录介绍 01.开班仪式02.并发编程专题之多线程基础03.并发编程专题之Java内存模 ...
随机推荐
- 解锁 Git Log 更多实用技巧
目前,在软件开发的协作中,Git 无疑是版本控制的王者. 而其中的 git log 命令,犹如一把强大的历史探寻之剑,能够帮助我们深入洞察项目的演进历程. 本篇将为大家整理解读几个实用的 git Lo ...
- Qt/C++开发经验小技巧306-310
远程过很多人电脑远程分析问题,发现一个通病,比如明明修改了某个数据库或者配置文件,结果运行程序一看,还是旧的数据,死活都不行,查了半天程序,始终找不到问题所在.最终查到原来是程序读取的文件根本不是修改 ...
- Qt音视频开发47-文字和图片水印(可存储到MP4中)
一.前言 近期花了两周时间闭门啃硬骨头,主要就解决三个问题(音视频同步存储和推流.图片水印并将水印信息存储到文件或者推流.rtsp推流),这三个问题困扰了很多年,以至于找遍了网络和翻遍ffplay代码 ...
- 关于Qt中的qss样式表需要注意的坑
关于QSS要注意的坑. qss源自css,相当于css的一个子集,主要支持的是css2标准,很多网上的css3的标准的写法在qss这里是不生效的,所以不要大惊小怪. qss也不是完全支持所有的css2 ...
- Qt音视频开发19-海康sdk录像存储
一.前言 关于调用海康sdk来进行录像存储,整体的框架架构处理流程沿袭了之前vlc内核.ffmpeg内核.mpv内核的做法,定时存储这块,开个定时器判断,到了时间则先关闭原来的录像存储,然后在开始一个 ...
- Qt音视频开发10-ffmpeg控制播放
一.前言 很多人在用ffmpeg做视频流解码的时候,都会遇到一个问题,如何暂停,如果打开的是本地视频文件,暂停你只需要停止解码即可,但是视频流你会发现根本没用,一旦你停止了解码,下次重新解码的时候,居 ...
- [转]Automatic Image Stitching with Accord.NET
原文链接:Automatic Image Stitching with Accord.NET
- JavaScript中find()和 filter()方法的区别小结
前言 JavaScript 在 ES6 上有很多数组方法,每种方法都有独特的用途和好处. 在开发应用程序时,大多使用数组方法来获取特定的值列表并获取单个或多个匹配项. 在列出这两种方法的区别之前,我们 ...
- 揭秘vivo百亿级厂商消息推送平台的高可用技术实践
本文由vivo 互联网服务器团队Yu Quan分享,本文收录时有内容修订和重新排版. 1.引言 如今,Android端的即时通讯IM这类应用想实现离线消息推送,难度越来越大(详见<Android ...
- 【饮食与健康】【AIGC创作】表观生理年龄逆转指北
一.引言 我们都知道,岁月不饶人,但是谁又不想在岁月的长河中留下青春的容颜呢?在这个人人都追求健康和美丽的时代,我们的生活节奏却愈发紧张,高压的工作和不规律的作息让我们的身体时刻处于亚健康状态.这时候 ...