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内存模 ...
随机推荐
- vscode本地调试gitbook
1. windows下载安装git 2.安装nodejs 下载安装nvm https://github.com/coreybutler/nvm-windows/releases/download/1. ...
- sort算法的使用
sort算法的使用 望文生义,sort是STL内置的一个排序算法,其底层是由多个排序算法的配合的使用. 需要包含的头文件 #include<algorithm> 使用 sort(参数1,参 ...
- 关于 Span 的一切:探索新的 .NET 明星: 2. Span<T> 是如何实现的?
2. Span<T> 是如何实现的? https://docs.microsoft.com/en-us/archive/msdn-magazine/2018/january/csharp- ...
- Java 项目愚蠢的分层及解决方案
<整洁架构之道>的最后一章<细节决定成败>又在讨论 Javaer 永恒的问题:分层后 DAO Service Controller 应该按功能分包还是按层分包. 按功能分包的人 ...
- 【转载】 进行API开发选gRPC还是HTTP APIs
https://www.cnblogs.com/yilezhu/p/10645804.html 开始之前先看一下gRPC与带有j'son的HTTP APIs对比表格 gRPC的优势 性能 gRPC消息 ...
- Intellij IDEA部署Web项目到tomcat时提示:Error:Cannot build Artifact ':war exploded' because it is included into a circul
在Idea中使用Maven创建父子工程,第一个Model的那个项目可以很好的运行,在创建一个Model运行时报这个错.原因是tomcat部署了多个Web项目,可能最开始是两个项目的配置文件混用用,最后 ...
- WPF 记录鼠标、触摸多设备混合输入场景问题
本文记录在WPF应用中鼠标.触摸混合输入,鼠标事件抬起时不会有MouseUp事件触发的问题. 事件输入我们都知道有3类:鼠标.触摸.触笔,鼠标是windows系统出来就有的事件,后面加了触笔.触摸. ...
- Detectron2使用
Detectron2使用 Detectron2安装 git clone https://github.com/facebookresearch/detectron2.git cd detectron2 ...
- AI应用平台搭建之旅(上) - 框架篇(附:AICon大会阿里国际Agent应用平台分享)
前言 LangEngine内源项目发起于阿里巴巴集团内部组织,LangEngine是类似LLM应用开发框架LangChain的纯Java版本.该框架现已正式对外开源:https://github.co ...
- Solution Set -「DS 专题」兔年的兔子写 DS 会有小常数吗?
目录 Day 1 「Ynoi 2009」「洛谷 P6109」rprmq1 ^ 「Ynoi Easy Round 2021」「洛谷 P8512」TEST_152 「Ynoi 2005」「洛谷 P7907 ...