Java进阶 - [1-4] 反射

news/发布时间2024/5/12 19:28:16

 

 

一、类加载区别

当我们刚接触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文件 .class

Step2:类加载器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、通过构造函数创建实例对象

 

五、反射相关的操作

  1. 通过无参构造函数创建实例对象
  2. 通过有参构造函数创建实例对象
  3. 反射通过私有构造函数创建对象,破坏单例模式
  4. 通过反射获得类的public属性值,演示getField与getDeclaredField两者的区别
  5. 通过反射获得类的private、protected、默认访问修饰符的属性值
  6. 通过反射获得类的private方法
  7. 我们采用反射机制来实现一个工具BeanUtils,可以将一个对象属性相同的值赋值给另一个对象。
  8. 通过mapstruct实现两个实体间的属性值复制

 

 

 

 

— 要养成终生学习的习惯 —

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/56028363.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

GitHub WebHook 使用教程

介绍 GitHub WebHook 的使用方式,GitHub 允许我们配置 WebHook ,它允许我们配置某个仓库发生某个事件时,通知指定的外部服务。本文收录于 Github.com/niumoo/JavaNotes,Java 系列文档,数据结构与算法! 本文收录于网站:https://www.wdbyte.com/,我的公众号:程序猿阿朗什…

2-14. 生成 ListView 列表

修改 ItemEditor 加载 ItemDataList_SO老师在调试的过程中发现,AssetDatabase.FindAssets 里面不需要加t:加载 ItemDetails测试 打开 Editor 窗口,然后就能看到有打印输出查看示例文档最终要的是实现 makeItem 和 bindItem。前者是列表中添加项目时候调用,后者是点击项目的时…

[转帖]重磅硬核|一文聊透对象在JVM中的内存布局等(一)

https://ost.51cto.com/posts/14747 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章?《从内核角度看IO模型的演变》,在这篇文章中我们通过图解的方式以一个C10k的问题为主线,从内核角度详细阐述了5种IO模型的演变过程,以及两种IO线…

MLIR多层中间表示——用MLIR构建编译器(上)

MLIR多层中间表示——用MLIR构建编译器(上) 1.1. MLIR概述 本文旨在介绍MLIR,不需要事先了解,但有时会将其与LLVM进行比较,因此具有LLVM的经验可能会使其更容易遵循。 将从MLIR的高级介绍开始,然后再深入了解一些内部内容,以及这些内容如何应用于示例用例。 概述 通过实…

2022年A组国赛

2022年A组国赛 小蓝与钥匙 题目大意: ​​ 题解: 显然,$ans=C_{28}^{14}\cdot f\left[ 14 \right]$ 其中 f[i] 表示i个人都没拿到自己的钥匙的情况数 f[i] 的递推式见代码 Code: #include <bits/stdc++.h> using namespace std; #define ioss ios::sync_with_stdio(f…