当前位置: 首页 > news >正文

JAVA-动态代理

文章目录

    • 概要
    • 两种主要方式
    • JDK 动态代理
      • Proxy 类
        • 作用:
        • 常用方法:
      • InvocationHandler 接口
        • 作用:
      • 目标对象、代理对象、被代理对象
      • JDK 动态代理工作原理
    • cjlib 动态代理
      • demo
    • 对比

概要

Java 动态代理利用 Java 的反射机制,可以在运行时生成代理类,并动态地将方法调用转发到一个 InvocationHandler 实现类,从而对方法调用进行自定义处理

两种主要方式

  • JDK 动态代理:基于接口生成代理类。
  • CGLIB 动态代理:通过字节码生成代理类,适用于没有接口的类

JDK 动态代理

使用 JDK 动态代理 时,Proxy.newProxyInstance() 方法用于创建一个 代理对象。这个代理对象看起来像是你手动实现的一个类,但实际上它是由 JVM 动态生成的。动态代理的特点是它不需要你事先编写一个具体的实现类,而是在运行时创建。

  • 具体demo
	// 用来在运行时创建代理对象,代理对象实现指定的接口,并将方法调用委托给 InvocationHandlerInvocationHandler invocationHandler = (proxy, method, Oargs) -> {System.out.println("begin");if (method.getName().equals("morning")) {HelloImpl helloImpl = new HelloImpl();method.invoke(helloImpl, Oargs[0]);}System.out.println("end");return proxy;};// 用来在运行时创建代理对象,代理对象实现指定的接口,并将方法调用委托给 InvocationHandlerHello o = (Hello)Proxy.newProxyInstance(Hello.class.getClassLoader(), new Class[]{Hello.class}, invocationHandler);o.morning("x");
);

Proxy 类

Proxy 类是 Java 提供的一个工具类,它允许你在运行时动态生成代理类。代理类可以实现一个或多个接口,并将方法的调用委托给指定的 InvocationHandler 进行处理。

作用:
  • 创建代理对象:通过 Proxy.newProxyInstance() 方法,你可以创建一个代理对象,代理对象在调用方法时会将调用传递给指定的 InvocationHandler 进行处理。
  • 动态代理:Proxy 是 JDK 动态代理机制的核心类。你可以通过它在运行时创建不需要显式实现的代理类(即不需要写实现类)。
常用方法:
  • newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h):
    • loader:指定类加载器,通常传入目标接口的类加载器。
    • interfaces:代理对象实现的接口,可以是多个接口。
    • h:InvocationHandler,用于处理代理对象方法的调用。

InvocationHandler 接口

InvocationHandler 是一个接口,它定义了一个方法 invoke(),用于在代理对象方法被调用时拦截并处理方法调用。通过实现 InvocationHandler 接口,你可以指定在代理对象调用方法时要执行的逻辑。

作用:
  • 方法拦截:InvocationHandler 的核心作用是拦截代理对象上调用的方法。在方法调用发生时,代理会委托给 InvocationHandler 的 invoke() 方法,由 invoke() 来决定如何处理这个调用。
  • 定制逻辑:你可以在 invoke() 方法中定义自定义的行为,比如日志记录、权限验证、方法的修改等。

目标对象、代理对象、被代理对象

目标对象:实现了接口的实际对象,代理的目标,通常是应用中的业务逻辑实现对象。
代理对象:JDK 动态代理在运行时生成的对象,它实现了目标对象的接口,拦截方法调用并转发给 InvocationHandler。
被代理对象:与目标对象相同,即原始的实际对象,代理对象会代替它进行方法调用。

JDK 动态代理工作原理

JDK 动态代理通过 Proxy.newProxyInstance() 方法创建代理对象,该方法的实现依赖于 Java 反射机制。以下是它的基本工作原理:

  1. 目标对象实现接口:目标对象必须实现接口,这是 JDK 动态代理的前提。动态代理不能直接代理类(即没有实现接口的普通类),因为它是基于接口的。
    目标对象不是必须得,可以直接使用接口也行,但是一般情况下都会先创建目标对象。

    Hello o = (Hello)Proxy.newProxyInstance(Hello.class.getClassLoader(), new Class[]{Hello.class}, invocationHandler);
    
  2. 生成代理对象:调用 Proxy.newProxyInstance() 方法时,JDK 会根据目标对象的接口动态生成一个代理类。这个代理类会实现目标对象的接口,并通过反射机制在每个方法被调用时,转发给 InvocationHandler 中的 invoke() 方法。

  3. InvocationHandler 处理逻辑:在 InvocationHandler 的 invoke() 方法中,你可以插入一些增强逻辑,比如打印日志、权限验证等,然后决定是否调用目标对象的实际方法。

  4. 反射机制:在 invoke() 方法中,通过反射机制获取被代理的方法信息,并可以选择性地调用目标对象的方法。

cjlib 动态代理

CGLIB 代理主要用于在运行时动态生成目标类的子类 ,原理是通过 继承 目标类来创建一个代理子类,并重写目标类中的方法,在方法执行前后进行增强。CGLIB 会在运行时通过 ASM(一个字节码处理框架)来生成目标类的子类,子类中的方法会调用父类的原方法,并且可以在方法调用前后插入额外的处理逻辑。

  • 目标类:UserService(你编写的业务逻辑类)。
  • 代理子类:UserServiceProxy(由 CGLIB 生成的类,继承了 UserService,并重写了其中的方法)

demo

package org.example.dynamicproxy.cglib;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.example.dynamicproxy.jdk.UserService;
import org.example.dynamicproxy.jdk.UserServiceImpl;import java.lang.reflect.Method;/*** @author: kangyu* @date: 2024/12/8 21:57**/
public class CglibProxyDemo {// 目标类public static class UserService {public void addUser(String name) {System.out.println("Adding user: " + name);}public void deleteUser(String name) {System.out.println("Deleting user: " + name);}}public static void main(String[] args) {// 创建 Enhancer 对象Enhancer enhancer = new Enhancer();enhancer.setSuperclass(UserService.class);  // 设置父类为 UserServiceenhancer.setCallback(new MethodInterceptor() {  // 设置方法拦截器@Overridepublic Object intercept(Object obj, java.lang.reflect.Method method, Object[] args,MethodProxy proxy) throws Throwable {System.out.println("Before method: " + method.getName());// 调用父类方法(即目标方法)Object result = proxy.invokeSuper(obj, args);System.out.println("After method: " + method.getName());return result;}});// 创建代理对象UserService userServiceProxy = (UserService) enhancer.create();// 使用代理对象userServiceProxy.addUser("kk");userServiceProxy.deleteUser("aa");}
}

对比

在这里插入图片描述

相关文章:

JAVA-动态代理

文章目录 概要两种主要方式JDK 动态代理Proxy 类作用&#xff1a;常用方法&#xff1a; InvocationHandler 接口作用&#xff1a; 目标对象、代理对象、被代理对象JDK 动态代理工作原理 cjlib 动态代理demo 对比 概要 Java 动态代理利用 Java 的反射机制&#xff0c;可以在运行…...

【前端】React_Next.js

定期更新&#xff0c;建议关注、收藏&#xff01; 安装 要使用react的框架&#xff0c;都应当安装node.js conda install nodejs选择Next.js 并创建项目 npx create-next-applatest可以看到目录结构生成如下 作为网页中的一个子路由 想让其嵌入已经写好的项目中&#xf…...

深入理解malloc与vector:内存管理的对比

引言‌ 在编程中&#xff0c;内存管理是一个至关重要的环节。无论是C语言中的malloc函数&#xff0c;还是C标准库中的vector容器&#xff0c;它们都在内存分配和释放上扮演着关键角色。然而&#xff0c;它们的设计理念和用法有着显著的不同。本文将深入探讨malloc和vector的区…...

LeetCode题练习与总结:四数相加 Ⅱ --454

一、题目描述 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;n…...

AI绘画设计实战-Day1

AI绘画变现方向&#xff1a; 生成猫咪拟人化&#xff1b;老照片修复&#xff1b;生成奇幻场景&#xff0c;换上客户的脸&#xff1b;生成商品详情模特图&#xff1b;商品宣传图&#xff1b;建筑/室内设计方案&#xff1b; AI视频-变现方向&#xff1a; AI跳舞视频&#xff…...

【Windows】ImmGetContext函数不适合跨进程工作

1. 教授回复 ChatGPT-o1: ImmGetContext() is not designed to work across process boundaries. It is indicates that a thread should not access the input context created by another thread, which implies that the function is intended for use within the same proc…...

【Linux】进程间通信——System V共享内存

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…...

fastAPI快速使用

1. 安装: pip install fastapi 并且安装uvicorn来作为服务器&#xff1a; pip install uvicorn 最简单的 FastAPI 文件可能像下面这样&#xff1a; # main.pyfrom fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message&qu…...

ruoyi前后端不分离创建module

ruoyi创建module 1.创建表 2.在若依中创建module 3.注意选择maven 4.命名 5&#xff0e;把module加入到rouyi的pom.xml中 6.student 中加入common依赖 二.生成代码 2.1先创建目录 2&#xff0e;2导入创建的表 2.3 注意各种配置 2.4预览代码 2.5 生成代码 2.6…...

【AI日记】24.12.08 kaggle 比赛 Titanic-11

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 内容&#xff1a; 学习 kaggle 入门比赛 Titanic - Machine Learning from Disaster学习机器学习&#xff08;pandas&#xff0c;numpy&#xff0c;sklearn&#xff0c;seaborn&#xff0c;matplotlib&a…...

处理后端返回的时间格式问题

今天在做项目的时候&#xff0c;发现后端返回的时间格式是“2024-12-08T06:11:46.00000:00”。 通过查阅资料&#xff0c;我发现这是后端返回的ISO 8601标准时间格式。这种格式在前端展示时可能不符合用户习惯&#xff0c;需要转换为更常见的“yyyy-MM-dd HH:mm:ss”格式&…...

【读书笔记·VLSI电路设计方法解密】问题33:ASIC芯片构建的主要步骤是什么

如问题32所述,ASIC芯片构建的主要步骤包括:RTL编写、功能验证、逻辑综合、布局布线、最终逻辑验证、时序验证、物理验证以及流片(Tapeout)。 RTL编写(RTL Coding) 这一阶段将设计意图从自然语言(如英文或中文)翻译为计算机可模拟的语言,以便进行仿真验证设计意图。此外…...

[机器学习] 监督学习之线性回归与逻辑回归

这里写目录标题 一、监督学习概述二、线性回归&#xff08;一&#xff09;模型表示&#xff08;二&#xff09;损失函数&#xff08;三&#xff09;梯度下降算法导入所需库生成模拟数据&#xff08;可替换为真实数据&#xff09;初始化参数并进行训练可视化损失函数随迭代次数的…...

十五、全局搜索正则表达式

一.grep简介 grep 全程Globally search a Regular Expression and Print&#xff0c;是一种强大的文本搜索工具&#xff0c;它能使用特 定模式匹配&#xff08;包括正则表达式&#xff09;搜索文本&#xff0c;并默认输出匹配行。Unix的grep家族包括grep和egrep 二.grep的工作…...

kali Linux 安装配置教程(图文详解)

目录 一、下载安装VMware二、下载kali镜像三、安装kali到虚拟机 一、下载安装VMware 点我查看 二、下载kali镜像 官网下载&#xff1a;https://www.kali.org/get-kali/#kali-platforms 演示下载的为下图左边的&#xff0c;实际我们直接下载右侧虚拟机的直接使用就行 右侧下…...

QT QTableWidget::setModel”: 无法访问 private成员

//严重性代码说明项目文件行禁止显示状态 //错误C2248 “QTableWidget::setModel”: 无法访问 private 成员(在“QTableWidget”类中声明) QSqlQueryModel* sql_model; ui.tableView_database->setModel(sql_model); //ok ui.tableWidget_database->setModel(sql_model)…...

C#怎么判断电脑是否联网

在 C# 中&#xff0c;可以通过几种方法检测计算机是否联网。以下是几种常用的方式&#xff1a; 1. 使用 System.Net.NetworkInformation.Ping 类 通过发送一个 Ping 请求到公共 DNS 服务器&#xff08;如 Google 的 DNS 8.8.8.8&#xff09;来检测是否联网。这是最常见的一种…...

丢垃圾视频时间检测 -- 基于状态机的实现

文章目录 OverviewKey PointsPseudo-code Overview 需要考虑的方面 状态定义和转换条件时序约束空间约束异常处理 状态机的设计需要考虑的场景&#xff1a; 没有人人进入人携带垃圾人离开但垃圾留下垃圾消失异常情况&#xff08;检测失败、多人多垃圾等&#xff09; Key P…...

EEG2Rep自监督脑电大模型文献阅读

原文网址&#xff1a; EEG2Rep: Enhancing Self-supervised EEG Representation... - Google 学术搜索https://scholar.google.com/scholar?hlzh-CN&as_sdt0%2C5&qEEG2Rep%3AEnhancingSelf-supervisedEEGRepresentationThroughInformativeMaskedInputs&btnG 1.文…...

【前端知识】React简单入门

React语法介绍 概述一、产生背景与发展历程二、主要特点三、技术细节四、应用场景与优势五、学习与实践 JSX语法一、JSX的基本概念二、JSX的基本使用三、JSX中的JavaScript表达式四、JSX的条件渲染五、JSX的列表渲染六、JSX的样式处理七、JSX的其他注意事项 基础语法一、基础概…...

高通---Camera调试流程及常见问题分析

文章目录 一、概述二、Camera配置的整体流程三、Camera的代码架构图四、Camera数据流的传递五、camera debug FAQ 一、概述 在调试camera过程中&#xff0c;经常会遇到各种状况&#xff0c;本篇文章对camera调试的流程进行梳理。对常见问题的提供一些解题思路。 二、Camera配…...

电压电流声音信号采集与分析系统

基于Labview的电压电流与声音信号采集与分析系统可以同时采集&#xff1a;电压、电流与振动信号。该系统部件可以采集传感器的真实数据&#xff0c;而且可以对采集的信号进行时域与频域分析&#xff0c;并可以实时显示历史数据&#xff0c;保存历史数据。具体的功能如下&#x…...

MongoDB语法及MongoTemplate用法

文章目录 概念操作数据库语法数据库及文档操作文档操作 整合springboot的MongoTemplate用法springboot配置插入删除更新查询 概念 1.MongoDB 是一个文档数据库&#xff0c;数据以 BSON 方式存储&#xff08;类似于json&#xff09; 2.文档&#xff08;Document&#xff09;&am…...

【git reset】本地下载特定历史提交哈希值的github文件【未联网服务器】进行git reset操作

本地电脑下载git文件&#xff0c;并进行git reset操作 问题描述&#xff1a;解决方法&#xff1a;方法1&#xff1a;直接下载特定版本的github压缩包。方法二&#xff1a; 在本地windows电脑上安装git工具进行git reset版本回退&#xff0c;之后上传相应版本的压缩包到服务器上…...

【开源安全保护】如何安装JumpServer堡垒机

【开源安全保护】如何安装JumpServer堡垒机 什么是堡垒机 大家好&#xff0c;我是星哥&#xff0c;今天我以前来认识堡垒机 堡垒机&#xff08;Bastion Host&#xff09;&#xff0c;也称为跳板机&#xff08;Jump Server&#xff09;&#xff0c;是指在计算机网络中&#x…...

log4j漏洞复现--vulhub靶场

声明&#xff1a;学习过程参考了同站的B1g0rang大佬的文章 Web网络安全-----Log4j高危漏洞原理及修复(B1g0rang) CVE-2021-44228 RCE漏洞 Log4j 即 log for java(java的日志) &#xff0c;是Apache的一个开源项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输…...

K8s面试系列:K8s常用 API 资源总结速记

写在前面 博文内容为 K8s 中常用的API 资源简单总结适合对K8s 有基本认知,温习,面试准备的小伙伴内容涉及:API 资源组成 ,SSA 和 CSA 资源操作方式,以及下面资源类别简单描述 工作负载:Deployments,StatefulSets,HorizontalPodAutoscaler (HPA)…服务: Service,Ingress,E…...

汽车免拆案例 | 2007款宝马650i车发动机偶尔无法起动

故障现象 一辆2007款宝马650i车&#xff0c;搭载N62B48B发动机&#xff0c;累计行驶里程约为26万km。车主反映&#xff0c;发动机偶尔无法起动&#xff0c;故障频率较低&#xff0c;十几天出现1 次&#xff0c;且故障出现时起动机不工作。 故障诊断  接车后试车&#xff0c;…...

前端(三)html标签(2)

html标签(2) 文章目录 html标签(2)一、列表标签二、表格三、form表单 一、列表标签 html中的列表分为无序列表、有序列表和自定义列表。 <!--无序列表的使用--> <!--pycharm中可以用ul>li*3tab的快捷键快速生成无序列表--> <ul><li>秒杀</li&g…...

D91【python 接口自动化学习】- pytest基础用法

day91 pytest的setup&#xff0c;setdown详解&#xff08;三&#xff09; 学习日期&#xff1a;20241207 学习目标&#xff1a;pytest基础用法 -- pytest的setup&#xff0c;setdown详解&#xff08;三&#xff09; 学习笔记&#xff1a; setup、teardown详解&#xff08;三…...

云桌面:云计算桌面

目录 云桌面的定义和核心概念 技术架构详解 主流架构详解 管理成本分析 安全性措施 应用场景详解 云桌面的定义和核心概念 云桌面是一种通过云计算技术提供的虚拟桌面服务&#xff0c;它允许用户通过网络访问远程服务器上的虚拟机&#xff0c;这些虚拟机为用户提供了一个…...

Word处理表格的一些宏

目录 1、表格首行居中2、表格内容靠左上下居中&#xff08;排除首行&#xff09; 1、表格首行居中 说明&#xff1a; 遇到错误将进行捕获&#xff0c;然后继续处理下一个表格 宏&#xff1a; Sub 表格首行居中()Dim tbl As tableOn Error Resume Next 错误时继续执行下一个…...

Linux网络编程---本地套接字

1.概述 本地套接字 1&#xff1a;作用:本地的进程间通信 2.有关系的进程间通信 3.没有关系的进程间的通信 本地套结字实现流程和网络套结字实现相似&#xff0c;一般采用tcp 二.通信流程 本地套结字通信的流程:1.服务器端:1.1 int fd socket(AF_UNIX/AF_LOCAL,…...

C#自动验证发票真假的程序

C#自动验证发票真假的程序 using Microsoft.Azure.CognitiveServices.Vision.ComputerVision; using Microsoft.Azure.CognitiveServices.Vision.ComputerVision.Models; using System; using System.IO; using System.Threading.Tasks;namespace InvoiceValidation {class Pr…...

后端技术进阶知识总结

前端开发、后端开发、AI算法与应用等技术进阶知识总结 前言1.前端开发2.后端开发3.AI算法3.1 Studio级别的AI工具使用 前言 本文不记录基础性问题和详细解决方案。只记录key idea。 1.前端开发 2.后端开发 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&…...

opencv复习

目录 1.core 1.图像变换 1.1 affine仿射变换 1.2 透视变换 2.四元数&#xff08;旋转&#xff09; 2.1 轴角转四元数 2.2 旋转矩阵转四元数 2.3 欧拉角转旋转矩阵 2.4 四元数转旋转矩阵 2.5 四元数用eigen用的比较多 2. imgproc. Image Processing 2.1 bilateralF…...

【Unity高级】在编辑器中如何让物体围绕一个点旋转固定角度

本文介绍如何在编辑器里让物体围绕一个点旋转固定角度&#xff0c;比如上图里的Cube是围绕白色圆盘的中心旋转45度的。 目标&#xff1a; 创建一个在 Unity 编辑器中使用的旋转工具&#xff0c;使开发者能够在编辑模式下快速旋转一个物体。 实现思路&#xff1a; 编辑模式下…...

通过IP远程连接MySQL服务时不允许连接到这个MySQL服务器

当你在连接Mysql时报这个错误时 is not allowed to connect to this MySQL server&#xff0c;意思是 MySQL 服务器不允许来自 IP 地址的连接。这通常是由于 MySQL 服务器的访问控制列表&#xff08;ACL&#xff09;限制了特定主机的连接。 要解决这个问题&#xff0c;你需要授…...

试题转excel;pdf转excel;试卷转Excel,word试题转excel

一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几乎需要一个下午的时间 关键这些事&#xff0c;枯燥无聊费眼睛&#xff0c;实在是看起来就很蠢的工作 就想着做一个工具&#xff0c;可以自动处理…...

wordpress网站使用Linux宝塔面板和SQL命令行导入导出超过50M限制的数据库

wordpress网站使用Linux宝塔面板添加mysql数据库&#xff0c;使用phpMyAdmin工具导入sql数据库文件&#xff0c;会有最大限制50M。即使把sql数据库文件压缩为gzip或zip压缩包&#xff0c;压缩包也超过50M&#xff0c;该怎么办&#xff1f;怎样导入超过50M数据库呢&#xff1f; …...

VCP-CLIP A visual context prompting modelfor zero-shot anomaly segmentation

GitHub - xiaozhen228/VCP-CLIP: (ECCV 2024) VCP-CLIP: A visual context prompting model for zero-shot anomaly segmentation 需要构建正样本&#xff0c;异常样本&#xff0c;以及对应的Mask...

【原生js案例】webApp实现鼠标移入移出相册放大缩小动画

图片相册这种动画效果也很常见&#xff0c;在我们的网站上。鼠标滑入放大图片&#xff0c;滑出就恢复原来的大小。现在我们使用运动定时器来实现这种滑动效果。 感兴趣的可以关注下我的系列课程【webApp之h5端实战】&#xff0c;里面有大量的css3动画效果制作原生知识分析&…...

杂谈随笔-关于unity开发游戏

最近有在做unity的游戏开发&#xff0c;都是自学&#xff0c;甚至没有完整的课程体系…… 在犹豫要不要出系列教程&#xff0c;帮助新手快速入门的同时算是巩固一下基础知识。 那这篇文章先谈谈我对于引擎开发游戏的一些小观点&#xff0c;算是做了这么十几个星期的微不足道的…...

base64转file文件对象

1.base64转file文件对象 //将base64转换为文件 dataURLtoFile(dataurl, filename) { var arr dataurl.split(,),mime arr[0].match(/:(.*?);/)[1],bstr atob(arr[1]),n bstr.length,u8arr new Uint8Array(n);while (n--) {u8arr[n] bstr.charCodeAt(n);}return new Fil…...

【jvm】为什么要有GC

目录 1. 自动内存管理2. 提升程序稳定性3. 优化性能4. 跨平台能力5. 分代回收策略 1. 自动内存管理 1.JVM中的GC机制负责自动管理内存&#xff0c;这意味着开发人员不需要手动分配和释放内存。2.这一特性大大简化了Java程序的内存管理&#xff0c;降低了内存泄漏和内存溢出等问…...

开发指南085-大号版elementUI

ElementUI有些地方显示实在太小&#xff0c;不方便操作&#xff0c;需要放大&#xff1a; 1、el-dialog的标题栏那个关闭符号 使用如下方法放大 ::v-deep .el-dialog__headerbtn { font-size: 40px; font-weight: 700; top: 0px; } 2、el-table-column 设置sor…...

#渗透测试#红蓝对抗#SRC漏洞挖掘# Yakit(5)进阶模式-MITM中间人代理与劫持(下)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

使用WebStorm开发Vue3项目

记录一下使用WebStorm开发Vu3项目时的配置 现在WebStorm可以个人免费使用啦&#xff01;?? 基本配置 打包工具&#xff1a;Vite 前端框架&#xff1a;ElementPlus 开发语言&#xff1a;Vue3、TypeScript、Sass 代码检查&#xff1a;ESLint、Prettier IDE&#xff1a;WebSt…...

Mac 录制电脑系统内的声音的具体方法?

1.第一步&#xff1a;下载BlackHole 软件 方式1&#xff1a;BlackHole官方下载地址 方式2&#xff1a; 百度云下载 提取码: n5dp 2.第二步&#xff1a;安装BlackHole 双击下载好的BlackHole安装包&#xff0c;安装默认提示安装。 3.第三步&#xff1a;在应用程序中找到音频…...

计算机网络

1.网络协议是什么&#xff1f; 在计算机网络要做到有条不紊地交换数据&#xff0c;就必须遵守一些约定好的规则&#xff0c;比如交换数据地格式&#xff0c;是否需要发送一个应答信息。这些规则被称为网络协议。 分层结构 应用层&#xff1a;为计算机用户提供服务表示层&…...