上一篇博客中实现了asm简单的对类中方法添加监听。
http://xkorey.iteye.com/admin/blogs/1551897
监听只是一个简单的切入并未对所切入方法的值做任何处理。
简单的打印出了
it's begin
helloWorld....
it's end
这次也做一点小改动,将改为
start value:hello
end value:hello world
将实现:监听函数的传入值。
首先将测试类 helloWorld 改造为:
public class helloWorld {
public void sayHello(String parm){
parm+=" world";
}
}
其次改造 asmAopMethodAdapter 对方法做修改的类,
public class asmAopMethodAdapter extends MethodAdapter implements Opcodes{
private final static int EXCEPTION_STACK = 2 + 1;//max_stack至少需要能够容纳2个常量地址(监控方法使用)和1个exception地址
private Label try_catch_start,try_catch_end;
private String startInfo,endInfo;
public asmAopMethodAdapter(MethodVisitor mv,String start,String end) {
super(mv);
try_catch_start = new Label();
try_catch_end = new Label();
startInfo = start;
endInfo = end;
}
public void visitCode() {
mv.visitCode();
mv.visitLabel(try_catch_start);
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
// mv.visitLdcInsn(startInfo);
//asmAopInvoker 这里写类的路径例如:com.asm.asmAopInvoker 应写成 com/asm/asmAopInvoker
mv.visitMethodInsn(INVOKESTATIC, "asmAopInvoker",
"methodStart", "(Ljava/lang/String;)V");
}
public void visitInsn(int opcode){
if(opcode >= IRETURN && opcode <= RETURN){
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
//mv.visitLdcInsn(endInfo);
//asmAopInvoker 这里写类的路径例如:com.asm.asmAopInvoker 应写成 com/asm/asmAopInvoker
mv.visitMethodInsn(INVOKESTATIC, "asmAopInvoker",
"methodEnd", "(Ljava/lang/String;)V");
}
mv.visitInsn(opcode);
}
public void visitEnd() {
mv.visitLabel(try_catch_end);
mv.visitTryCatchBlock(try_catch_start, try_catch_end, try_catch_end, null);
//mv.visitLdcInsn(endInfo);
//asmAopInvoker 这里写类的路径例如:com.asm.asmAopInvoker 应写成 com/asm/asmAopInvoker
//mv.visitMethodInsn(INVOKESTATIC, "asmAopInvoker",
"methodEnd", "(Ljava/lang/String;)V");
mv.visitInsn(Opcodes.ATHROW);
mv.visitEnd();
}
public void visitMaxs(int maxStack,int maxLocals){
//保证max stack足够大
mv.visitMaxs(Math.max(EXCEPTION_STACK,maxStack), maxLocals);
}
}
其中改变的部分是
将
// 个人理解:是将一个Object写入到class中
mv.visitLdcInsn(endInfo);
改为
// 个人理解:访问方法内的第一个参数
mv.visitVarInsn(ALOAD, 0);
// 个人理解:获取这个参数的值
mv.visitVarInsn(ALOAD, 1);
这次运行环境依旧是jdk1.6,asm 3.3.1
其中的类已打包。
分享到:
相关推荐
本篇文章将深入探讨如何使用ASM库来实现函数监听,特别是如何在函数执行前拦截并改变其参数值。 首先,我们需要理解ASM库的基本用法。ASM提供了一套API,可以直接生成或修改字节码。在Java中,每个类都是以字节码...
**键盘钩子(Win32 ASM实现)** 在Windows操作系统中,键盘钩子是一种系统级技术,允许应用程序监听和处理其他应用程序的键盘输入事件。这种技术通常由汇编语言(Assembly)或C/C++等高级语言实现。在这个场景中,...
Edit控件的文本可以通过SetWindowText函数进行修改,而用户输入的文本变化则可以通过EN_CHANGE消息进行监听。 3. ListBox控件:ListBox控件展示一系列可选择的项,用户可以选择一个或多个项。使用CreateWindowEx...
程序员通过助记符来编写代码,如MOV(移动)、ADD(加法)、SUB(减法)等,这些指令在经过汇编器转换后生成二进制机器码,可供计算机执行。 在这个“汇编计算器”项目中,你将看到如何用汇编语言实现基本的算术...
《Asm.rar_Keypad_汇编语言》是关于汇编语言编程的一个资源包,主要涉及了几个关键领域的应用:按键处理、掉电保存、液晶显示以及串口通信。这些内容构成了嵌入式系统开发的基础模块,对于理解底层硬件控制和优化...
在汇编代码中,这些API调用需要通过`Call`指令完成,并且需要正确设置参数,包括地址和参数值。 以压缩包中的`map.asm`文件为例,我们可以看到源代码中可能包含以下关键部分: 1. **初始化**:设置堆栈和数据段,...
实现这一功能需要监听键盘输入,当"S"键被按下时,程序进入时间设定模式。用户可能需要通过键盘输入新的小时、分钟和秒,然后更新并重新显示时间。这部分涉及到键盘扫描码的解析以及时间值的更新逻辑。 在设计程序...
- `ConnectStruct *pConnectStruct`:指向连接结构体的指针,包含连接方式(监听端口或连接主机)等信息。 - `LPCTSTR lpszBindCmd`:绑定的命令字符串指针。 #### `ShowHelp` - **作用**:显示帮助信息,包括...
5. **系统调用**:理解如何在Asm中调用操作系统提供的函数,如创建socket、bind、listen、accept、send、recv等。 6. **网络编程实践**:通过编写简单的客户端和服务器程序,加深对网络编程的理解。 7. **错误处理...
CGLib是基于ASM库实现的,能够对运行时的类进行字节码操作,从而实现对类的扩展和增强。 CGLib的核心概念是Enhancer,它允许开发者创建一个子类,而无需显式地定义子类。Enhancer提供了许多配置选项,如设置拦截器...
而提高要求则包括了对多种编程语言(如Java, C, C++, ASM等)的关键词语法高亮,剪贴板操作,搜索和替换功能,以及二进制文件的16进制编辑。 【概要设计】阶段,开发者计划使用JAVA的图形用户界面(GUI)编程技术来...
按键驱动程序是操作系统与硬件交互的重要组成部分之一,主要用于捕捉和处理用户通过物理按钮产生的输入事件。对于嵌入式系统来说,按键驱动尤其重要,因为它们通常用于执行关键的操作,比如电源管理或者菜单导航等。...
我们需要在程序的消息处理函数中监听这个消息,比如`WM_HOTKEY`,然后根据接收到的消息执行相应的操作。 3. **资源管理**:在标签中提到的“资源”,在Windows编程中指的是应用程序使用的各种非代码资源,如图标、...
在IT领域,编程时常会遇到各种需求,其中之一就是如何控制鼠标的行为。本篇文章将深入探讨“防止鼠标回滚”这一主题,特别是在Delphi环境下如何实现这一功能。首先,我们要理解什么是鼠标回滚以及为什么要防止它。 ...
- `Subclass.asm` 和 `Subclass.cls` 可能是实现子类化技术的源代码,用于扩展或修改Winsock控件的行为。 - `modExceptionHandler.bas` 可能包含了异常处理代码,确保在出现错误时程序能够正常运行。 - `modWinsock....
如聚合函数(SUM, AVG, COUNT, MAX, MIN)用于对一组值进行统计,字符串函数(SUBSTR, CONCAT, INSTR)用于处理字符数据,日期函数(SYSDATE, ADD_MONTHS, TO_CHAR)帮助处理时间数据。通过文档,你可以了解到这些...
`Delay.asm`文件很可能是用于控制单片机发送数据间隔的延时函数,因为按照PS/2协议,数据的发送需要有一定的时序。延时函数对于精确控制通信时序至关重要,确保数据正确地被接收。 至于`AT键盘接口资料.pdf`,这...
源代码文件展示了具体的实现细节,包括UART初始化和字符串发送的函数;电路图文件描绘了硬件连接,帮助理解如何将单片机与主机相连;而仿真配置文件则用于指导在仿真环境中运行和测试程序。 通过学习这个教程,...
- 创建数据库:学习使用Database Configuration Assistant (DBCA)创建新数据库,包括设置数据库参数、选择存储类型(如ASM)、确定字符集和确定数据库实例的大小。 - 初始化参数文件:理解初始化参数的作用,如何...