包扫描工具实现(详解)

前言

注解在 Java 是一个非常重要的存在,而且它出现的非常频繁。

在一个工程下可能有许多的包或者Jar包,为了结合注解可以准确的定位到一个需要的类上,并且扫描到一个包下的所有类方便我们使用反射机制,所以产生了包扫描工具实现的想法,它可以帮我们找到带有注解的类,再通过反射执行。

包扫描

我们可以通过用户提供的包名,扫描该包下的所有类。

实现思路(需求分析):

通过博主思考,我们需要实现功能:

  • 一个工程下存在普通包或者Jar包,分开处理 Jar 包和普通包;

  • 得到该包下我们所要找的类(例如:带有注解的类或者接口或者枚举类型等)这里主要用于扫描带有注解的类。

因为通过包扫描找到该类,我们可以通过注解信息得到该类里面带有注解的成员或方法的信息,然后通过反射机制执行。

具体实现

  • 创建一个 IClassDealer接口:
public interface IClassDealer {
	void classDealer(Class<?> klass);
}
  • 包扫描类实现:

    • 这里根据包名,通过得到 url 协议名称,然后判断是 Jar 包还是普通包,如果是普通包就调用 fileScan(String packageName, File dir)这个方法,进行普通包扫描,如果是 Jar 包,就调用jarScan(String packageName, URL url),进行 Jar 扫描。

      	public void scanPackage(String packageName) throws URISyntaxException {
      		String packagePath = packageName.replace(".", "/");
      		URL url = Thread.currentThread().getContextClassLoader().getResource(packagePath);
      		if (url.getProtocol().equals("file")) {
      			File root = new File(url.toURI());
      			fileScan(packageName, root);
      		} else if (url.getProtocol().equals("jar")) {
      			try {
      				jarScan(packageName, url);
      			} catch (IOException e) {
      				e.printStackTrace();
      			}
      		}
      	}
      
    • 普通包扫描

      	private void fileScan(String packageName, File dir) {
      		File[] files = dir.listFiles();
      		for (File file : files) {
      			if (file.isDirectory()) {
      				fileScan(packageName + "." + file.getName(), file);
      			} else {
      				String fileName = file.getName();
      				if (!fileName.endsWith(".class") || fileName.contains("$")) {
      					continue;
      				}
      				fileName = fileName.replace(".class", "");
      				String className = packageName  + "." + fileName;
      				try {
      					Class<?> klass = Class.forName(className);
      					classDealer.classDealer(klass);
      				} catch (ClassNotFoundException e) {
      					e.printStackTrace();
      					continue;
      				}
      			}
      		}
      	}
      
    • Jar 扫描

      	private void jarScan(String packageName, URL url) throws IOException {
      		JarURLConnection connection = (JarURLConnection) url.openConnection();
      		JarFile jarFile = connection.getJarFile();
      		Enumeration<JarEntry> entries = jarFile.entries();
      		while (entries.hasMoreElements()) {
      			JarEntry entry = entries.nextElement();
      			String entryName = entry.getName();
      			String className = entryName.replace("/", ".");
      			
      			if (!className.startsWith(packageName) || className.contains("$") || !entryName.endsWith(".class")) {
      				continue;
      			}
      			className = className.replace(".class", "");
      			try {
      				Class<?> klass = Class.forName(className);
      				classDealer.classDealer(klass);
      			} catch (ClassNotFoundException e) {
      				e.printStackTrace();
      			}
      		}
      	}
      

完整代码

  • 创建一个 IClassDealer接口:
public interface IClassDealer {
	void classDealer(Class<?> klass);
}
  • 包扫描具体代码:
package com.hb.util;

import java.io.File;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class PackageScanner {
    /**
    *因为扫描到的类的相关具体操作不是本工具需要完成的,
	*因此给一个接口,具体操作由工具使用者完成。
	*用这个方法可以去筛选使用者需要扫描的包下的类达到自己的目的。
    */
	private IClassDealer classDealer;
	
	public PackageScanner() {
		this.classDealer = new IClassDealer() {
			@Override
			public void classDealer(Class<?> klass) {
			}
		};
	}

	public PackageScanner addClassDealer(IClassDealer classDealer) {
		this.classDealer = classDealer;
		return this;
	}

	public void scanPackage(String packageName) throws URISyntaxException {
		String packagePath = packageName.replace(".", "/");
		URL url = Thread.currentThread().getContextClassLoader().getResource(packagePath);
		if (url.getProtocol().equals("file")) {
			File root = new File(url.toURI());
			fileScan(packageName, root);
		} else if (url.getProtocol().equals("jar")) {
			try {
				jarScan(packageName, url);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	private void jarScan(String packageName, URL url) throws IOException {
		JarURLConnection connection = (JarURLConnection) url.openConnection();
		JarFile jarFile = connection.getJarFile();
		Enumeration<JarEntry> entries = jarFile.entries();
		while (entries.hasMoreElements()) {
			JarEntry entry = entries.nextElement();
			String entryName = entry.getName();
			String className = entryName.replace("/", ".");
			
			if (!className.startsWith(packageName) || className.contains("$") || !entryName.endsWith(".class")) {
				continue;
			}
			className = className.replace(".class", "");
			try {
				Class<?> klass = Class.forName(className);
				classDealer.classDealer(klass);
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
	}
	
	private void fileScan(String packageName, File dir) {
		File[] files = dir.listFiles();
		for (File file : files) {
			if (file.isDirectory()) {
				fileScan(packageName + "." + file.getName(), file);
			} else {
				String fileName = file.getName();
				if (!fileName.endsWith(".class") || fileName.contains("$")) {
					continue;
				}
				fileName = fileName.replace(".class", "");
				String className = packageName  + "." + fileName;
				try {
					Class<?> klass = Class.forName(className);
					classDealer.classDealer(klass);
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
					continue;
				}
			}
		}
	}
}

测试运行结果:

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本光盘括三部分内容。 1.本书源代码 含了本书的1~50章全部源代码。 2.ICON 含了作者多年收集的精美图标。 3.本书附录 含了ADO常用类介绍和Windows常用消息大全两项内容。 ================================================================================================================================ 第1章 光驱开关控制程序 第2章 系统硬件信息查看器 第3章 注册表操作 第4章 读取网卡物理地址 第5章 剪贴板查看程序 第6章 进程查看程序 第7章 透明窗体实例 第8章 状态栏对话框 第9章 带微调和滑动条控件的工具栏 第10章 仿Winamp界面多媒体播放器 第11章 数据库操作--ODBC篇 第12章 数据库操作-DAO篇 第13章 数据库操作-ADO篇 第14章 Excel编程 第15章 拨号上网实例 第16章 FTP协议编程 第17章 Telnet协议编程 第18章 Email协议编程 第19章 基于UDP协议的网段扫描器 第20章 具有异形窗口的网络电话 第21章 电影播放器 第22章 AVI视频制作编程 第23章 文字语音朗读编程 第24章 浏览EXE或DLL文件的所有图标 第25章 BMP位图操作 第26章 滚动浏览位图 第27章 透明位图背景上的滚动字幕实例 第28章 小波算法的VC实现 第29章 基因算法的VC实现 第30章 多线程串口Modem远程数据通信 第31章 Windows XP风格之微软篇 第32章 Windows XP风格之Windows XP风格菜单 第33章 Windows XP风格之Office XP风格菜单 第34章 Windows XP风格之Windows XP风格SDI例程 第35章 Windows XP风格之Windows XP风格对话框 第36章 Windows XP风格之Windows XP风格按钮和滚动条ActiveX控件 第37章 动态链接库(DLL)实例 第38章 文件查找 第39章 只运行一个实例的程序 第40章 使用键盘钩子实现按键发音程序 第41章 密码探测器 第42章 多线程实例 第43章 进程通信 第44章 读取Intel CPU序列号 第45章 获取硬盘序列号 第46章 消息循环重载实例 第47章 运行后自销毁的程序 第48章 VC中OpenGL编程实现虚拟现实 第49章 图像复合文档高级编程 第50章 基于卫星通信的汽车牌照识别监控系统 =========================================================================================================================== 本书中所有例程在Windows2000 Professonal+VC++6.0(英文企业版+SP5)下调试通过,绝大部分例程可以在Windows98/ME/2000/XP下运行,且可以 在Visual Studio.Net中自动转换为VC.NET工程。建议读者安装Microsoft Access 2000/XP方便修改数据库篇用到的*.mdb数据库文件。 每章例程源代码中括源文件和编译好的exe可执行文件(该文件可能位于本章工程目录中或者工程目录下的Debug目录中) 。 注意事项: 1. 若读者将源代码光盘全部复制到硬盘上调试,则复制完成后应该去掉文件的只读属性,否则在硬盘上重新编译工程时会出现不可写的提示。 2. 本书例程大部分采用的是动态链接,读者在未装VC的PC机上运行每章例程中的可执行文件时,可能会出现找不到mfc42.dll等动态链接库的情况, 读者此时可采用静态链接,具体操作为:VC中菜单Project->Setting->General->Microsoft Foundation Classes 选为“Use MFC in a Static Library”,重新编译工程即可。 3. 若按F5调试程序时,VC提示不能进行调试,此时请将VC中菜单->Build->Set Active Configuration选为“Win32 Debug”,重新编译工程即可。 4. 在VC中若运行工程时提示不能执行exe文件,此时请将VC中菜单Project->Setting->General->Executable for debug Session 重新定位到该工 程的exe可执行文件
该书共分成15个章节,由易到难,由浅及深的介绍了MFC的功能框架和实际运用。每个知识点都有对应的代码实例。学习起来快速而不费力。更重要的是不是扫描版本。看着舒服。 目录结构如下: 目 录 译者序 前言 第一部分 基础知识 第1章 窗口 2 1.1 窗口和API环境 2 1.1.1 三种类型窗口 2 1.1.2 客户区和非客户区 3 1.2 窗口和MFC环境 4 1.3 怎样应用MFC创建一个窗口 5 1.4 怎样使用MFC销毁一个窗口 9 1.4.1 捆绑到一个已有的窗口 9 1.4.2 窗口类 10 1.4.3 窗口进程 10 1.5 怎样使用MFC创建一个窗口类 11 1.5.1 使用AfxRegisterWndClass () 函数注册一个窗口类 11 1.5.2 使用AfxRegisterClass ()函数 创建一个窗口类 12 1.6 怎样销毁一个MFC窗口类 14 1.7 厂商安装的窗口类 14 1.8 其他类型窗口 15 1.9 桌面窗口 16 1.10 小结 16 第2章 类 18 2.1 基类 18 2.1.1 CObject 18 2.1.2 CCmdTarget 19 2.1.3 CWnd 19 2.2 应用程序、框架、文档和视图类 19 2.2.1 CWinApp(O/C/W) 20 2.2.2 CView (O/C/W) 21 2.3 其他用户界面类 22 2.3.1 通用控件类 23 2.3.2 菜单类 23 2.3.3 对话框类 24 2.3.4 控制条类 24 2.3.5 属性类 25 2.4 绘图类 25 2.4.1 设备环境类 25 2.4.2 图形对象类 25 2.5 文件类 26 2.6 数据库类 26 2.6.1 ODBC类 26 2.6.2 DAO类 27 2.7 数据集类 27 2.8 其他数据类 27 2.9 通信类 28 2.10 其他类 29 2.11 小结 31 第3章 消息处理 32 3.1 发送或寄送一个消息 32 3.1.1 发送一个消息 32 3.1.2 寄送一个消息 32 3.1.3 发送一个消息与寄送一个消息 的比较 32 3.2 怎样使用MFC发送一个消息 33 3.3 怎样用MFC寄送一个消息 33 3.4 三种类型的消息 34 3.4.1 窗口消息 34 3.4.2 命令消息 34 3.4.3 控件通知 34 3.5 MFC怎样接收一个寄送的消息 36 3.6 MFC怎样处理一个接收到的消息 36 3.7 处理用户界面的对象 44 3.8 创建自定义窗口消息 45 3.8.1 静态分配的窗口消息 45 3.8.2 动态分配的窗口消息 46 3.9 重定向消息 47 3.9.1 子分类和超分类 47 3.9.2 用MFC子分类窗口 48 3.9.3 重载OnCmdMsg ( ) 49 3.9.4 使用SetWindowsHookEx ( ) 49 3.9.5 使用SetCapture ( ) 49 3.9.6 专有的消息泵 50 3.10 小结 50 第4章 绘图 51 4.1 设备环境 51 4.2 在MFC环境中创建一个设备环境 52 4.2.1 屏幕 52 4.2.2 打印机 53 4.2.3 内存 54 4.2.4 信息 54 4.3 绘图例程 55 4.3.1 画点 55 4.3.2 画线 55 4.3.3 画形状 55 4.3.4 形状填充和翻转 55 4.3.5 滚动 56 4.3.6 绘制文本 56 4.3.7 绘制位图和图标 56 4.4 绘图属性 56 4.4.1 设备环境属性 57 4.4.2 画线属性 58 4.4.3 形状填充属性 58 4.4.4 文本绘制属性 58 4.4.5 映像模式 59 4.4.6 调色板属性 62 4.4.7 混合属性 62 4.4.8 剪裁属性 63 4.4.9 位图绘制属性 64 4.5 元文件和路径 65 4.5.1 元文件 65 4.5.2 路径 66 4.6 颜色和调色板 66 4.6.1 抖动色 67 4.6.2 未经抖动色 67 4.6.3 系统调色板 67 4.6.4 使用系统调色板 68 4.6.5 动画色 71 4.7 控制什么时候在哪里绘图 71 4.7.1 处理WM_PAINT 71 4.7.2 只绘制被无效化的区域 72 4.7.3 处理WM_DRAWITEM 72 4.7.4 在其他时间绘图 73 4.8 小结 74 第二部分 用户界面实例 第5章 应用程序与环境 76 5.1 例1 规划MFC应用程序 76 5.2 例2 用AppWizard创建一个MFC 应用程序 79 5.3 例3 用ClassWizard创建一个类 83 5.4 例4 初始化应用程序屏幕 84 5.
R的极客理想:工具篇 带书签扫描版(1/2) 目录 封面 -20 书名 -18 版权 -17 前言 -16 目录 -7 第一部分 R基础 1 第1章 R语言基础 2 1.1 R是最值得学习的编程语言 1.2 R的历史版本安装 8 1.3 fortunes记录R语言的大智慧 11 1.4 formatR代码自动化排版 13 1.5 多人在线协作R开发RStudio Server 22 1.6 R和JSON的傻瓜式编程 29 1.7 R语言的高质量图形渲染库Cairo 40 1.8 caTools:一个奇特的工具集 46 第2章 时间序列基础 58 2.1 R语言时间序列基础库zoo 58 2.2 可扩展的时间序列xts 75 2.3 时间序列可视化plot.xts 93 第3章 R性能监控 104 3.1 R语言本地缓存工具memoise 104 3.2 R语言性能监控工具Rprof 108 3.3 R语言性能可视化工具lineprof 116 第二部分 R服务器 122 第4章 R语言的跨平台通信 122 4.1 Rserve与Java的跨平台通信 122 4.2 Rsession让Java调用R更简单 126 4.3 解惑rJava R与Java的高速通道 132 4.4 Node.js与R跨平台通信 137 第5章 R的服务器实现 143 5.1 R语言服务器程序Rserve详解 143 5.2 Rserve的R语言客户端RSclient 149 5.3 FastRWeb:跑在Web上的R程序 153 5.4 R语言构建Websocket服务器 159 第三部分 数据库和大数据 168 第6章 数据库和NoSQL 168 6.1 RMySQL数据库编程指南 168 6.2 R利剑NoSQL 之MongoDB 183 6.3 R利剑NoSQL之Redis 192 6.4 R利剑NoSQL之Cassandra 200 6.5 R利剑NoSQL之Hive 206 6.6 用RHive从历史数据中提取逆回购信息 212 第7章 RHadoop 222 7.1 R语言为Hadoop注入统计血脉 222 7.2 RHadoop安装与使用 226 7.3 RHadoop实验:统计邮箱出现次数 233 7.4 RHadoop实现基于MapReduce的协同过滤算法 236 7.5 rHBase安装与使用 249 7.6 解决RHadoop安装错误:PipeMapRed.waitOutputThreads() 253 第四部分 附录 262 附录A Java环境安装 262 附录B MySQL数据库安装 266 附录C Redis数据库安装 270 附录D MongoDB数据库安装 273 附录E Cassandra数据库安装 277 附录F Hadoop安装 280 附录G Hive环境安装 287 附录H HBase安装 290
smss.exe  Session Manager 这个进程是不可以从任务管理器中关掉的。 这是一个会话管理子系统,负责启动用户会话。这个进程是通过系统进程初始化的并且对许多活动的, 括已经正在运行的Winlogon,Win32(Csrss.exe)线程和设定的系统变量作出反映。在它启动这些进程后,它等待Winlogon或者Csrss结束。如果这些过程时正常的,系统就关掉了。如果发生了什么不可预料的事情,smss.exe就会让系统停止响应(就是挂起)。 spoolsv.exe 这个进程是不可以从任务管理器中关掉的。 缓冲(spooler)服务是管理缓冲池中的打印和传真作业。 service.exe 这个进程是不可以从任务管理器中关掉的。 大多数的系统核心模式进程是作为系统进程在运行。 含很多系统服务 csrss.exe 子系统服务器进程 winlogon.exe 管理用户登录和推出的。而且winlogon在用户按下CTRL+ALT+DEL时就激活了,显示安全对话框。 winmgmt.exe win2000客户端管理的核心组件。当客户端应用程序连接或当管理程序需要他本身的服务时这个进程初始化 lsass.exe 这个进程是不可以从任务管理器中关掉的。 这是一个本地的安全授权服务,并且它会为使用winlogon服务的授权用户生成一个进程。这个进程是过使用授权的,例如默认的msgina.dll来执行的。如果授权是成功的,lsass就会产生用户的进入令牌,令牌别使用启动初始的shell。其他的由用户初始化的进程会继承这个令牌的。 svchost.exe 含很多系统服务 !!!->eventsystem,(SPOOLSV.EXE 将文件加载到内存中以便迟后打印等。)(附:Svchost.exe文件对那些从动态连接库中运行的服务来说是一个普通的主机进程名。Svhost.exe文件定位在系统的 %systemroot%\system32文件夹下。在启动的时候,Svchost.exe检查注册表中的位置来构建需要加载的服务列表。这就会使 多个Svchost.exe在同一时间运行。每个Svchost.exe的回话期间都含一组服务, 以至于单独的服务必须依靠Svchost.exe怎样和在那里启动。这样就更加容易控制和查找错误. Svchost.exe 组是用下面的注册表值来识别。 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Svchost 每个在这个键下的值代表一个独立的Svchost组,并且当你正在看活动的进程时,它显示作为一个单独的 例子。每个键值都是REG_MULTI_SZ类型的值而且括运行在Svchost组内的服务。每个Svchost组都含一个 或多个从注册表值中选取的服务名,这个服务的参数值含了一个ServiceDLL值。 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Service explorer.exe 资源管理器 (internat.exe 托盘区的拼音图标) 就像任务条,桌面等等。这个进程并不是像你想象的那样是作为一个重要的进程运行在windows中,你可以从任务管理器中停掉它,或者重新启动。 通常不会对系统产生什么负面影响。 taskmagr.exe 这个进程就是任务管理器。 System Idle Process 这个进程是不可以从任务管理器中关掉的。 这个进程是作为单线程运行在每个处理器上,并在系统不处理其他线程的时候分派处理器的时间。 mstask.exe 这个进程是不可以从任务管理器中关掉的。 这是一个任务调度服务,负责用户事先决定在某一时间运行的任务的运行。 internat.exe 这个进程是可以从任务管理器中关掉的。 internat.exe在启动的时候开始运行。它加载由用户指定的不同的输入点。输入点是从注册表的这个位置HKEY_USERS\.DEFAULT\Keyboard Layout\Preload 加载内容的。 internat.exe 加载“EN”图标进入系统的图标区,允许使用者可以很容易的转换不同的输入点。 当进程停掉的时候,图标就会消失,但是输入点仍然可以通过控制面板来改变。 附加的系统进程(这些进程不是必要的,你可以根据需要通过服务管理器来增加或减少) regsvc.exe 允许远程注册表操作。(系统服务)->remoteregister winmgmt.exe 提供系统管理信息(系统服务):netinfo.exe->msftpsvc,w3svc,iisadmn tlntsvr.exe->tlnrsvr tftpd.exe 实现 TFTP Internet 标准。该标准不要求用户名和密码。远程安装服务的一部分。(系统服务) termsrv.exe ->termservice dns.exe 应答对域名系统(DNS)名称的查询和更新请求。(系统服务) 以下全是系统服务,并且很少会用到,如果你暂时用不着,应该关掉(对安全有害 ) tcpsvcs.exe  提供在 PXE 可远程启动客户计算机上远程安装 Windows 2000 Professional的能力。(系统服务)->simptcp 支持以下 TCP/IP 服务:Character Generator, Daytime, Discard, Echo, 以及 Quote of the Day。(系统服务) ismserv.exe  允许在 Windows Advanced Server 站点间发送和接收消息。(系统服务) ups.exe   管理连接到计算机的不间断电源(UPS)。(系统服务) wins.exe   为注册和解析 NetBIOS 型名称的 TCP/IP 客户提供 NetBIOS 名称服务。(系统服务) llssrv.exe   License Logging Service(system service) ntfrs.exe   在多个服务器间维护文件目录内容的文件同步。(系统服务) RsSub.exe   控制用来远程储存数据的媒体。(系统服务) locator.exe   管理 RPC 名称服务数据库.->rpclocator(区 RpcSs) lserver.exe   注册客户端许可证。(系统服务) dfssvc.exe   管理分布于局域网或广域网的逻辑卷。(系统服务) clipsrv.exe   支持"剪贴簿查看器",以便可以从远程剪贴簿查阅剪贴页面。(系统服务) msdtc.exe   并列事务,是分布于两个以上的数据库,消息队列,文件系统,或其它事务保护资源管理器。(系统服务) faxsvc.exe   帮助您发送和接收传真。(系统服务) cisvc.exe   Indexing Service(system service)!!! dmadmin.exe   磁盘管理请求的系统管理服务。(系统服务) mnmsrvc.exe   允许有权限的用户使用 NetMeeting 远程访问 Windows 桌面。(系统服务) netdde.exe   提供动态数据交换 (DDE) 的网络传输和安全特性。(系统服务) smlogsvc.exe   配置性能日志和警报。(系统服务) rsvp.exe   为依赖质量服务(QoS)的程序和控制应用程序提供网络信号和本地通信控制安装功能。(系统服务) RsEng.exe   协调用来储存不常用数据的服务和管理工具。(系统服务) RsFsa.exe   管理远程储存的文件的操作。(系统服务) grovel.exe   扫描零备份存储(SIS)卷上的重复文件,并且将重复文件指向一个数据存储点,以节省磁盘空间。(系统服务) SCardSvr.exe   对插入在计算机智能卡阅读器中的智能卡进行管理和访问控制。(系统服务) snmp.exe   含代理程序可以监视网络设备的活动并且向网络控制台工作站汇报。(系统服务) snmptrap.exe   接收由本地或远程 SNMP 代理程序产生的陷阱消息,然后将消息传递到运行在这台计算机上 SNMP 管理程序。(系统服务) UtilMan.exe   从一个窗口中启动和配置辅助工具。(系统服务) msiexec.exe   依据 .MSI 文件中含的命令来安装、修复以及删除软件。(系统服务) dllhost.exe   win2000的话,一般是组件com调用的需要dllhost装入内存。所以dllhost.exe负责asp3.0组件装入内存。iis启动后。有一个大约20mb左右的dllhost。如果你的web应用程序不能释放内存。如关掉数据库连接,释放对象。这个dllhost会越来越大。还有一个dllhost是。web客户端的。大约5mb左右。用多层构架的概念来理解,就是一个是dllhost存根,一个是dllhost骨干。com远程访问缺一不可。
Charles 是一款网络抓工具,它可以让你查看应用程序和网站之间的通信数据,从而帮助你进行调试和分析。以下是使用 Charles 的详细步骤: 1. 下载并安装 Charles:在官方网站上下载 Charles 并按照提示进行安装。 2. 配置 Charles:打开 Charles,然后在菜单栏中选择“Proxy” -> “Proxy Settings”,在弹出的窗口中选择“HTTP”选项卡,将“Port”设置为 8888,并勾选“Enable transparent HTTP proxying”和“Enable macOS Proxy”。 3. 配置移动设备:如果你想抓取移动设备的数据,需要将移动设备的网络代理设置为 Charles 的 IP 地址和端口号(默认为 8888)。具体方法请查看 Charles 官方文档。 4. 开始抓:在 Charles 中点击“Record”按钮,然后使用你的应用程序或浏览器访问网站,在 Charles 中就可以看到通信数据了。 5. 查看数据:在 Charles 中可以看到所有的请求和响应数据。你可以选择任何一个请求或响应来查看其详细信息,括请求头、响应头、请求体和响应体等。 6. 修改数据:如果你需要修改某个请求的数据,可以右键点击请求并选择“Edit”,然后进行修改即可。 7. 断点调试:如果你需要在某个请求或响应时暂停抓以进行调试,可以在 Charles 中右键点击该请求或响应并选择“Breakpoints” -> “Add”,然后在弹出的窗口中勾选“Request”或“Response”,并设置相应的条件即可。 总之,Charles 是一款非常方便的网络抓工具,可以帮助你快速定位和解决各种网络问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HB0o0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值