【JavaWeb】反射与模块化(学习笔记)

一、类加载器

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,<?>... parameterTypesMethod[] 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.接口内的方法();	// 实现其模块实现类的方法
}

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

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

相关文章

SpringBoot简单整合mybatis

1. maven依赖 <!-- mybatis --> <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version></dependency><!-- mysql驱动 -->&…

华为OD机试 - 螺旋数字矩阵(Java JS Python C)

题目描述 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数 n (0 < n ≤ 999)和行数 m(0 < m ≤ 999),从左上角的 1 开始,按照顺时针螺旋向内写方式,依次写出2,3,....,n,最终形成一个 m 行矩阵。 小明对这个矩阵有些要求:…

精品Nodejs实现的校园疫情防控管理系统的设计与实现健康打卡

《[含文档PPT源码等]精品Nodejs实现的校园疫情防控管理系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Win…

Docker 概述以及整体架构

文章目录 一、Docker概述1.1 什么是 Docker1.2 Docker 如何工作1.3 底层技术 二、Docker架构2.1 Docker 整体架构2.2 Docker daemon2.3 Docker client2.4 Docker registries2.5 Docker objects2.6 Docker Desktop 参考资料 一、Docker概述 1.1 什么是 Docker Docker是一个用于…

【Linux专区】如何配置新服务器 | 添加普通用户到sudoers | 配置vim | git免账号密码pull push

&#x1f49e;&#x1f49e;欢迎来到 Claffic 的博客&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《Linux专区》&#x1f448; &#x1f4ac;前言&#xff1a; 时隔131天&#xff0c;你的好友Claffic重新发文了&#xff01;(✿◕‿◕✿) 上期已经带大家白嫖了阿…

PHP获取今天,昨天,本周,本月,季度,年份等特殊时间戳方法整理

获取当前时间戳与日期格式时间 time() //获取当前十位时间戳 msectime() //获取当前十三位时间戳 date(Y-m-d h:m:s) //获取当前日期格式时间 今天时间戳与日期 时间戳 $startTime strtotime(date(Y-m-d).00:00:00); $overTime strtotime(date(Y-m-d).23:59:59); 日期…

【MATLAB】PSO粒子群优化LSTM(PSO_LSTM)的时间序列预测

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 PSO粒子群优化LSTM&#xff08;PSO-LSTM&#xff09;是一种将粒子群优化算法&#xff08;PSO&#xff09;与长短期记忆神经网络&#xff08;LSTM&#xff09;相结合的混合模型。该算法通过…

什么是 JavaScript 中的 WeakMap

在 JavaScript 中&#xff0c;WeakMap 是一种特殊的 Map 数据结构&#xff0c;它允许将对象作为键&#xff0c;而且键值对是弱引用的关系。 与 Map 不同的是&#xff0c;WeakMap 的键只能是对象&#xff0c;不能是其他类型的值。同时&#xff0c;当键对象没有任何引用时&#…

一篇文章掌握SpringCloud与SpringCloud Alibaba的区别

目录 一、SpringCloud组件的升级与替换 二、服务注册中心的比较 1、根据CAP理论对注册中心进行分类 2、Zookeeper通过Zab协议保证强一致性 3、Eureka保证高可用性 4、Nacos既支持AP模式又支持CP模式 三、服务调用框架的比较 1、Ribbon 2、OpenFeign 3、Dubbo 四、服…

设计模式之初始设计模式和UML图

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

SSH远程登陆服务器

截取自文章&#xff1a;SSH简介及两种远程登录的方法_ssh -CSDN博客 SSH的安装 SSH分为客户端 openssh-client 和服务器 openssh-server&#xff0c;可以利用以下命令确认电脑上是否安装了客户端和服务器。 dpkg -l | grep ssh 如果只是想远程登陆别的机器只需要安装客户端&…

web播放rtsp流视频,使用webrtc毫秒级延迟

目录 一、zlmediakit环境搭建和编译 1)、下载zlmediakit 2)、安装依赖 3)、编译webrtc 4)、启动zlmediakit 二、播放webrtc视频 1)、动态添加拉流代理 2)、播放视频 三、嵌入到自己的vue项目中。 1)、拷贝demo到自己的vue项目中 2)、mkcert生成证书 背景&#xff1…

shell shell脚本编写常用命令 语法 shell 脚本工具推荐

shell 脚本 计算机语言 Shebang 定义解释器 主要定义&#xff0c;您的脚本是用什么语言写的 #!/usr/bin/python //定义这是一个python语言#!/bin/bash //定义这是一个shell语言 echo SHELL我们执行的 linux 命令的时候&#xff0c;其实是使用 /bin/bash 这个二进制文…

鸿蒙应用开发 应用内字体大小调节

1 数据管理概述 在移动互联网蓬勃发展的今天&#xff0c;移动应用给我们生活带来了极大的便利&#xff0c;这些便利的本质在于数据的互联互通。因此在应用的开发中数据存储占据了非常重要的位置&#xff0c;HarmonyOS 应用开发也不例外。 本文将为您介绍 HarmonyOS 提供的数据…

stm32 HAL库 4096线ABZ编码器

[TOC]目录 ABZ编码器 4096线 买的是这个 AB相代表计数方向&#xff0c;Z代表过零点 cubemx配置 定时器Encoder 也可以选上DMA 中断 Z相GPIO中断 找一个空闲管脚 打开对应中断 代码 不用DMA int main(void) {short Enc_cnt 0;HAL_TIM_Encoder_Start_IT(&ht…

DrGraph原理示教 - OpenCV 4 功能 - 单通道图

通道 OpenCV的核心处理对象是Mat&#xff0c;大体是一个二维数组&#xff0c;加上了各种功能函数。 很多的图像处理&#xff0c;会在单通道或二值化的基础上进行&#xff0c;比如连通域、目标识别等。这里的通道就是channels。 不同的图像处理算法可能对通道数有特定的要求。例…

HTML5+CSS3+JS小实例:过年3D烟花秀

实例:过年3D烟花秀 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><…

前端需要学GraphQL 吗?

什么是GraphQL&#xff1f; GraphQL 是 Facebook 开发的一个数据查询语言&#xff0c;可以让前端开发者更具体地指定他们需要什么数据&#xff0c;从而使数据获取更加高效。GraphQL 是一种数据查询和操作语言&#xff0c;它主要被设计用来作为 API 的请求语言。与传统的 RESTf…

#前后端分离# 头条发布系统

头条业务简介 用户功能 注册功能登录功能jwt实现 新闻 新闻的分页浏览通过标题关键字搜索新闻查看新闻详情新闻的修改和删除 预览界面 开源上线 https://gitcode.net/NVG_Haru/NodeJS_5161447 数据库设计 数据库脚本 CREATE DATABASE sm_db;USE sm_db;SET NAMES utf8mb4…