【JavaSE】反射与模块化

简介: 【JavaSE】反射与模块化

一、类加载器

1、类加载

1)类加载方式

JVM通过类的加载,类的连接,类的初始化对类进行初始化

类的加载:class文件读入内存,创建java.lang.Class对象

2)类的连接

验证:检验类

准备:分配内存,设置默认初始化值

解析:二进制数据中的符号引用替换为直接引用

3)类的初始化

对类变量进行初始化

类没被加载或连接 --> 先加载并连接

父类为初始化 --> 初始化直接父类(最先初始化Object类)

类中有初始化语句 --> 执行初始化语句

2、类的初始化时机

  1. 创建对象,调用方法
  2. 初始化子类
  3. java.exe命令运行主类
  4. 反射创建类或接口的java.lang.Class对象

3、类加载器的作用

将.class加载到内存,生成java.lang.Class对象

4、JVM的类加载机制

全盘负责:加载类及其相关类

父类委托:让父类加载器加载

缓存机制:用过的类有缓存

5、加载器分类

Bootstrap class loader:内置类加载器,通常表示为null

Platform class loader:平台类加载器,加载api、运行时类

System class loader:应用程序类加载器,定义应用程序路径、模块路径

6、ClassLoader类方法

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

二、反射概述

1、反射

通过类加载器加载的.class文件对象的Class类进行调用

反射是框架设计的灵魂

框架:半成品软件。可以在框架基础上进行软件开发,简化编码

2、反射机制

将类的各个组成部分封装成其他对象

3、反射优点

  1. 可以在程序运行中操作对象 idea
  2. 可以解耦,提高程序可扩展性

4、Java代码的三个阶段

  1. Source源代码:.java ->(javac编译) .class
  2. Class类对象:*.class ->(ClassLoader类加载器) class类对象
  3. Runtime运行阶段:创建对象

三、获取class对象的方式

1、Class.forName()

Source源代码阶段:Class.forName("包名.类名");

Class类的静态方法

将字节码文件加载进内存,返回class对象

2、类名.class

Class类对象阶段:类名.class

通过类名的属性返回class对象

3、对象.getClass()

Runtime运行阶段:对象.getClass()

定义在Object类中

同一个字节码文件(*.class)在一次程序运行中只会加载一次

四、Class对象功能

1、获取成员方法

Field[] getFields()                    //获取所有public修饰成员
File getField(String name)            //获取指定名称public修饰成员

Field[] getDeclaredFields()            //获取所有的成员
File getDeclaredField(String name)    //获取指定名称的成员

Field成员变量:

  1. 设置值:void set(Object obj, Object value)
  2. 获取值:get(Object obj)

暴力反射(忽略权限修饰符的安全检查):变量对象.setAccessible(true);

2、获取构造方法

Constructor<?>[] getConstructor()
Constructor<T> getConstructor(<?>... parameterTypes)    //指定构造方法的参数 String.class int.class ...

Constructor<?>[] getDeclaredConstructor()
Constructor<T> getDeclaredConstructor(<?>... parameterTypes)

Constructor构造方法:Object obj = 构造方法对象.newInstance(构造)

3、获取成员方法

Method[] getMethods()
Method getMethods(String name,<?>... parameterTypes

Method[] getDeclaredMethods()
Method getDeclaredMethods(String name,<?>... parameterTypes)

Method方法对象:

  1. 执行方法:方法对象.invoke(Object obj, Object...args);
  2. 获取方法名:String getname()

4、获取类名

String getName()

五、越过泛型检查

List<Integer> list = new ArrayList<>();
list.add(123);
Method m = list.getClass().getMethod("add", Object.class);
m.invoke(list,"hello");
System.out.println(list);

六、运行配置文件的指定方法

className=...
methodName=...
Properties prop = new Properties();
prop.load(new FileReader("xxx.txt"));
Class<?> c = Class.forName(prop.getProperty("className"));
Method m =c.getMethod(prop.getProperty("methodName"));
Object obj = c.newInstance();
m.invoke(obj);

七、模块化使用

Java9推出模块化

  1. 在模块的scr目录下新建module-info.java的描述文件
  2. 对于导出模块:exports 包名;
  3. 对于导入模块:requires 包名;

八、模块服务的使用

1、导出模块

描述文件:provides 接口名 with 实现类

2、导入模块

1、描述文件:uses 接口名

2、加载服务:ServiceLoader<接口名> 变量名 = ServiceLoader.Load(导出模块名.class);

3、遍历服务:

for(接口名 变量名2 : 变量名){
   
    变量名2.接口内的方法();    // 实现其模块实现类的方法
}
目录
相关文章
|
弹性计算 Linux Shell
ECS基本命令及简单应用
本场景介绍如何申请阿里云ECS环境资料,并在其下进行基本的Linux命令操作。
|
存储 编译器 数据库
【C/C++ 数据结构 】线索二叉树全解析:从数学原理到C++实现
【C/C++ 数据结构 】线索二叉树全解析:从数学原理到C++实现
349 0
|
前端开发 JavaScript 开发者
【开启微前端新时代】微前端:构建可扩展、可维护的现代 Web 应用
【开启微前端新时代】微前端:构建可扩展、可维护的现代 Web 应用
|
监控 Linux 数据安全/隐私保护
CentOS7下安装SNMP服务
CentOS7下安装SNMP服务
655 0
CentOS7下安装SNMP服务
|
人工智能 文字识别 算法
视觉智能开放平台产品使用合集之是否支持老照片修复
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
121 1
视觉智能开放平台产品使用合集之是否支持老照片修复
|
存储 弹性计算 人工智能
阿里云「云上超智融合计算论坛」登陆【CCF HPC China 2024】
【2024 CCF 全国高性能计算学术年会】将于9月24-26日在中国·武汉举行,阿里云智能集团副总裁,弹性计算负责人和存储负责人吴结生,将在大会主论坛带来题为《AI 驱动,阿里云高性能计算的创新和发展》的主题演讲。
阿里云「云上超智融合计算论坛」登陆【CCF HPC China 2024】
|
SQL 算法 关系型数据库
MySQL Online DDL原理解读
MySQL Online DDL原理解读
|
Kubernetes 网络协议 网络安全
nftables用法介绍
nftables用法介绍
589 2
|
XML 搜索推荐 数据格式
资源描述框架的用途及实际应用解析
**RDF(资源描述框架)**是一种用于机器理解网络资源的框架,使用XML编写。它通过URI标识资源,用属性描述资源,便于计算机应用程序处理信息。RDF在语义网上促进信息的确切含义和自动处理,使得网络信息可被整合。RDF语句由资源、属性和属性值组成。RDF文档包括`&lt;rdf:RDF&gt;`根元素和`&lt;rdf:Description&gt;`元素,后者用`about`属性标识资源。RDF还支持容器(如`&lt;Bag&gt;`、`&lt;Seq&gt;`和`&lt;Alt&gt;`)来描述集合。RDFS是RDF的扩展,提供描述类和属性的框架,而达布林核心是一组预定义属性,用于描述文
366 0
|
数据挖掘 API 开发工具
天猫商品详情数据接口(Tmall.item_get)
天猫商品详情数据接口(Tmall.item_get)
天猫商品详情数据接口(Tmall.item_get)