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内存模 ...
随机推荐
- 腾讯云携手Commvault,为云上用户提供安全存储服务
11月2日获悉,腾讯云对象存储COS近日正式通过Commvault备份软件标准化测试,并获得官方认证. 同时,Commvault对COS的支持已经从底层打通.这意味着用户只要购买了腾讯云COS的云存储 ...
- RabbitMQ vs MSMQ
- shell 下 exec,source,.,bash和sh以及export得区别
exec执行命令时,不会启用新的shell进程. source和 .也不会启用新的shell进程,在当前shell中执行,设定的局部变量在执行完命令后仍然有效. bash或sh执行时,会另起一个子 ...
- vertx 获取请求参数
表单登录(GET) <form action="/login"> <input type="text" name="user ...
- 龙哥量化:通达信macd黄白线变色公式macd金叉怎么写macd死叉怎么写(需要继续优化,各种变色方式)
你提出的任何逻辑要求,只要是软件能实现的,我都能用通达信写出来,我レメLong622889通达信.大智慧.文华.博易的编程逻辑差不多,只是个别函数不一样.TB交易开拓者.金字塔和文华8,都是专业的期货 ...
- Qt编写视频监控系统77-Onvif组件支持非正常时间的设备
一.前言 在经历了大量的现场设备测试,至少几十种厂家.几百种设备,遇见过奇奇怪怪的问题,一个个想方设法解决,发现有个问题是在下发鉴权的时候,需要带上设备的时间,而不是发送端的时间,如果带的不是设备上的 ...
- Qt音视频开发32-Onvif网络设置
一.前言 用onvif协议来对设备的网络信息进行获取和设置,这个操作在众多的NVR产品中,用的很少,绝大部分用户都还是习惯直接通过摄像机的web页面进去配置,其实修改网络配置的功能在大部分的NVR中都 ...
- DVWA靶场JavaScript Attacks漏洞low(低),medium(中等),high(高),impossible(不可能的)所有级别通关教程
JavaScript Attacks (前端攻击) JavaScript Attacks(前端攻击)漏洞通常涉及利用Web应用程序中的安全漏洞,特别是在JavaScript代码的使用和实现上,从而对用 ...
- WPF设置默认语言地区CultureInfo
public partial class App : Application { public App() { CultureInfo cultureInfo = new CultureInfo(&q ...
- Elasticsearch(4)--- 基本概念(Index、Type、Document、集群、节点、分片及副本、倒排索引)
这篇博客讲到基本概念包括: Index.Type.Document.集群,节点,分片及副本,倒排索引. 一.Index.Type.Document 1.Index index:索引是文档(Docume ...