IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 反射的简单知识 -> 正文阅读

[Java知识库]反射的简单知识

? ? ? ? 由于博主只是学了反射的一点皮毛,所以只能浅谈一下反射的相关知识。

目录

类加载器

? ? ? ? 类加载

? ? ? ? ? ? ? ? 类的加载:

????????????????类的连接:

????????????????类的初始化:

? ? ? ? 类加载器

? ? ? ? ? ? ? ? 作用:

? ? ? ? ? ? ? ? JVM的类加载机制:

? ? ? ? ? ? ? ? ClassLoader:

反射

? ? ? ? 概述:

? ? ? ? 获取Class对象:

????????反射获取构造方法并使用

????????????????Class类中用于获取构造方法的方法:

????????????????Constructor类中用于创建对象的方法:

? ? ? ? ? ? ? ? 注意事项:

????????反射获取成员变量并使用

????????????????Class类中用于获取成员变量的方法:

????????????????Field类中用于给成员变量赋值的方法:

????????反射获取成员方法并使用

????????????????Class类中用于获取成员方法的方法:

????????????????Method类中用于调用成员方法的方法:

模块化

? ? ? ? 概述:

? ? ? ? 模块的基本使用

? ? ? ? ? ? ? ? 基本步骤:

????????模块服务的使用

? ? ? ? ? ? ? ? 基本步骤:


类加载器

? ? ? ? 类加载

? ? ? ? ? ? ? ? 概述:

????????????????????????当程序要用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化。如果不出现意外情况,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或类初始化。

? ? ? ? ? ? ? ? 类的加载:

? ? ? ? ? ? ? ? ? ? ? ? 概述:

????????????????????????????????·就是指将class文件读入内存,并为之创建一个java.lang.Class对象。
????????????????????????????????·任何类被使用时,系统都会为之建立一个java.lang.Class对象。

????????????????类的连接:

????????????????? ? ? ??概述:

????????????????????????????????·验证阶段:用于检验被加载的类是否有正确的内部结构,并和其他类协调一致。
????????????????????????????????·准备阶段:负责为类的类变量分配内存,并设置默认初始化值。
????????????????????????????????·解析阶段:将类的二进制数据中的符号引用替换为直接引用???????。? ? ? ? ? ? ? ??

????????????????类的初始化:

? ? ? ? ? ? ? ? ? ? ? ? 概述:

????????????????????????????????·在该阶段,主要就是对类变量进行初始化。

? ? ? ? ? ? ? ? ? ? ? ? 步骤:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (1)假如类还未被加载和连接,则程序先加载并连接该类。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)假如该类的直接父类还未被初始化,则先初始化其直接父类。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (3)假如类中有初始化语句,则系统依次执行这些初始化语句。
????????????????注意:在执行第2个步骤的时候,系统对直接父类的初始化步骤也遵循初始化步骤1-3

? ? ? ? ? ? ? ? ? ? ? ? 时机:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (1)创建类的实例
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)调用类的类方法
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (3)访问类或者接口的类变量,或者为该类变量赋值
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (4)使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (5)初始化某个类的子类
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (6)直接使用java.exe命令来运行某个主类

? ? ? ? 类加载器

? ? ? ? ? ? ? ? 作用:

????????????????????????·负责将.class文件加载到内存中,并为之生成对应的java.lang.Class对象。
????????????????????????·虽然我们不用过分关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。

? ? ? ? ? ? ? ? JVM的类加载机制:

????????????????????????(1)全盘负责:就是当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入。
? ? ? ? ? ? ? ? ? ? ? ? (2)父类委托:就是当一个类加载器负责加载某个Class时,先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。
? ? ? ? ? ? ? ? ? ? ? ? (3)缓存机制:保证所有加载过的Class都会被缓存,当程序需要使用某个Class对象时,类加载器先从缓存区中搜索该Class,只有当缓存区不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换为Class对象,存储到缓存区。

? ? ? ? ? ? ? ? ClassLoader:

? ? ? ? ? ? ? ? ? ? ? ? 概述:

????????????????????????????????是负责加载类的对象

? ? ? ? ? ? ? ? ? ? ? ? 分类:

????????????????????????????????(1)Bootstrap class loader:它是虚拟机的内置类加载器,通常表示为null,并且没有父null。
????????????????????????????????(2)Platform class loader:平台类加载器可以看到所有平台类,平台类包括由平台类加载器或其祖先定义的Java SE平台API,其实现类和JDK特定的运行时类。
????????????????????????????????(3)System class loader:它也被称为应用程序类加载器,与平台类加载器不同。系统类加载器通常用于定义应用程序类路径,模块路径和JDK特点工具上的类。
????????·类加载器的继承关系:System的父加载器为Platform,而Platform的父加载器为Bootstrap

? ? ? ? ? ? ? ? ? ? ? ? 方法:

????????????????????????????????(1)static ClassLoader getSystemClassLoader():返回用于委派的系统类加载器。
????????????????????????????????(2)ClassLoader getParent():返回父类加载器进行委派。

反射

? ? ? ? 概述:

????????????????Java反射机制是指在运行时获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展。

? ? ? ? 获取Class对象:

????????????????我们要想通过反射去使用一个类,首先我们要获取到该类的字节码文件对象,也就是类型为Class类型的对象这里我们提供三种方式获取Class类型的对象
????????????????(1)使用类的Class属性来获取该类对应的Class对象。举例:Student.class将会返回Student类对应的Class对象
? ? ? ? ? ? ? ? (2)调用对象的getClass()方法,返回该对象所属类对应的Class对象
?? ?????????????????该方法是Object类中的方法,所有的Java对象都可以调用该方法
? ? ? ? ? ? ? ? (3)使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整包名的路径。

? ? ? ? ? ? ? ? 最常用第三种

????????反射获取构造方法并使用

????????????????Class类中用于获取构造方法的方法:

????????????????????????·Constructor<?>[] getConstructors():返回所有公共构造方法对象的数组。
????????????????????????·Constructor<?>[] getDeclaredConstructors():返回所有构造方法对象的数组。
????????????????????????·Constructor<T> getConstructor(Class<?>...parameterTypes):返回单个公共构造方法对象。
????????????????????????·Constructor<T> getDeclaredConstructor(Class<?>...parameter Types):返回单个构造方法对象。

????????????????Constructor类中用于创建对象的方法:

????????????????????????·T newInstance(Object...initargs):根据指定的构造方法创建对象。

? ? ? ? ? ? ? ? 注意事项:

????????????????????????·基本数据类型也可以通过.class得到对应的Class类型。
????????????????????????·public void setAccessible(boolean flag):值为true,取消访问检查。

????????反射获取成员变量并使用

????????????????Class类中用于获取成员变量的方法:

????????????????????????·Field[] getFields():返回所有公共成员变量对象的数组。
????????????????????????·Field[] getDeclaredFields():返回所有成员变量对象的数组。
????????????????????????·Field getField(String name):返回单个公共成员变量对象。
????????????????????????·Field getDeclaredField(String name):返回单个成员变量对象。

????????????????Field类中用于给成员变量赋值的方法:

????????????????????????·void set(Object obj, Object value):给obj对象的成员变量赋值为value。

????????反射获取成员方法并使用

????????????????Class类中用于获取成员方法的方法:

????????????????????????·Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的。
????????????????????????·Method[] getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的。
????????????????????????·Method getMethod(String name, Class<?>...parameterTypes):返回单个公共成员方法对象。
????????????????????????·Method getDeclaredMethod(String name,Class<?>...parameterTypes):返回单个成员方法对象。

????????????????Method类中用于调用成员方法的方法:

????????????????????????·Object invoke(Object obj, Object...args):调用obj对象的成员方法,参数时args,返回值是Object类型。

模块化

? ? ? ? 概述:

????????????????

????????????????Java语言随着这些年的发展已经成为了一门影响深远的编程语言,无数平台,系统都采用Java语言编写。但是,伴随着发展,Java也越来越庞大,逐渐发展成为一门“臃肿”的语言。而且,无论是运行一个大型的软件系统,还是运行一个小程序,即使程序只需要使用Java的部分核心功能,JVM也要加载整个JRE环境。为了给Java“瘦身”,让Java实现轻量化,Java 9正式的推出了模块化系统。Java被拆分为N多个模块,并允许Java程序可以根据需要选择加载程序必须的Java模块,这样就可以让Java以轻量化的方式来运行。

????????????????其实,Java 7的时候已经提出了模块化的概念,但由于其过于复杂,Java 7,Java 8都一直未能真正推出,知道Java 9才真正成熟起来。对于Java语言来说,模块化系统是一次真正的自我革新,这种革新使得“古老而庞大”的Java语言重新焕发年轻的活力。

? ? ? ? 模块的基本使用

? ? ? ? ? ? ? ? 基本步骤:

????????????????????????(1)创建模块(按照以前的讲解方式创建模块,创建包,创建类,定义方法)
????????????????????????(2)在模块的src目录下新建一个名为module-info.java的描述性文件,该文件专门定义模块名,访问权限,模块依赖等信息
?? ?描述性文件中使用模块导出和模块依赖来进行配置并使用
????????????????????????(3)模块中所有未导出的包都是模块私有的,他们是不能在模块之外被访问的
?? ?在myOne这个模块下的描述性文件中配置模块导出
?? ?????????????????模块导出格式:exports 包名;
????????????????????????(4)一个模块要访问其他的模块,必须明确指定依赖哪些模块,未明确指定依赖的模块不能访问
?? ?????????????????在myTwo这个模块下的描述性文件中配置模块依赖
?? ?????????????????模块依赖格式:requires 模块名
?? ?注意:写模块名报错,需要按下Alt + Enter提示,然后选择模块依赖
????????????????????????(5)在myTwo这个模块的类中使用依赖模块下的内容

????????模块服务的使用

? ? ? ? ? ? ? ? 基本步骤:

????????????????????????(1)在myOne模块下创建一个包com.itheima_03,在该包下提供一个接口,接口中定义一个抽象方法
?? ?????????????????????????public interface MyService{
?? ??? ?????????????????????????void service();
????????????????????????????????}
????????????????????????(2)在com.itheima_03包下创建一个包impl,在该包下提供接口的两个实现类Itheima和Czxy
????????????????????????(3)在myOne这个模块下的描述性文件中添加如下配置
?? ?????????????????????????模块导出:exports com.itheima_03;
?? ?????????????????????????服务提供:provides MyService with Itheima;?? ?指定MyService的服务实现类是Itheima

????????????????????????(4)在myTwo这个模块下的描述性文件添加如下配置
?? ?????????????????????????声明服务接口:uses MyService;
????????????????????????(5)在myTwo这个模块的类中使用MyService接口提供的服务
?? ?????????????????????????ServiceLoader:一种加载服务实现的工具

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:13:47  更:2021-08-21 15:14:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:43:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码