3.2.3转换方法
现在,你已经猜到了,方法可以像类一样就行转换,例如,通过使用一个方法适配器来转发那些带有修改的方法调用:改变参数可以被用来变更指令,不转发某个方法调用可以删除一个指令,插入新的调用可以添加新的指令。MethodAdapter类提供了这样的基本实现,它仅仅转发它收到的所有方法调用。
为了弄清楚方法适配器如何使用,让我们考虑一个简单的例子,删除方法中的NOP指令(删除该指令不会带来任何问题,因为这个指令不做任何事情):
public class RemoveNopAdapter extends
MethodAdapter {
public
RemoveNopAdapter(MethodVisitor mv) {
super(mv);
}
@Override
public
void visitInsn(int opcode) {
if
(opcode != NOP) {
mv.visitInsn(opcode);
}
}
}
这个适配器可以用在一个类适配器中,像下面一样:
public class RemoveNopClassAdapter extends
ClassAdapter {
public
RemoveNopClassAdapter(ClassVisitor cv) {
super(cv);
}
@Override
public
MethodVisitor visitMethod(int access, String name,
String
desc, String signature, String[] exceptions) {
MethodVisitor
mv;
mv
= cv.visitMethod(access, name, desc, signature, exceptions);
if
(mv != null) {
mv
= new RemoveNopAdapter(mv);
}
return
mv;
}
}
这个类适配器主要用来构建方法适配器,该适配器封装链上的下一个Class Visitor返回的方法适配器,然后返回该适配器。这个方法适配器链构造的效果类似于之前的类适配器链(参看图3.5)。
尽管上面的要求不是强制性的,但是仍然可能构造一个与类适配器链不同的方法适配器链。每个方法甚至都可以有一个不同的方法适配器链。例如,类适配器可以选择在方法中而不是构造方法中移除NOP指令。可以像下面这样来实现:
...
mv = cv.visitMethod(access, name, desc,
signature, exceptions);
if (mv != null &&
!name.equals("<init>")) {
mv = new RemoveNopAdapter(mv);
}
...
图3.5 RemoveNopAdapter序列图
在这个例子中,针对构造方法的适配器链要短一些。相反地,针对构造方法的适配器链也可以更长,可以将几个方法适配器在visitMethod方法内部链接在一起。方法适配器链也可以拥有与类适配器链不同的拓扑图结构。例如,类适配器链应该是线性的,而方法适配器可以有分支:
public MethodVisitor visitMethod(int
access, String name,
String
desc, String signature, String[] exceptions) {
MethodVisitor
mv1, mv2;
mv1
= cv.visitMethod(access, name, desc, signature, exceptions);
mv2
= cv.visitMethod(access, "_" + name, desc, signature, exceptions);
return
new MultiMethodAdapter(mv1, mv2);
}
现在,我们已经了解了如何在一个类适配器中使用方法适配器,以及如何组装它们,下面让我们来看看如何实现比RemoveNopAdapter更有趣的适配器。
- 大小: 20.7 KB
分享到:
相关推荐
s变换用的高斯窗函数( 高斯窗是指数窗的一种,它也无负的旁瓣,而且没有旁瓣波动,因而不回引起计算谱中假的极大值或极小值,而且高斯窗频率窗函数的主瓣比指数窗的主瓣窄,分辨率比指数窗有所提高。
2021科大讯飞车辆贷违预测大赛冠军源码+全部资料.zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!
AI图像处理工具包-一键抠图、背景切换、旧照片修复、人像漫画化、视频卡通化(Python+OpenCV+Dlib+TensorFlow).zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!
基于java+springboot+vue+mysql的远程教育网站设计与实现.docx
毕业设计资料,计算机毕业设计,源码,毕业论文,毕业答辩,答辩PPT,Java毕业设计,php毕业设计,ASP.NET毕业设计,毕业指导,计算机作业,php作业,java作业,ASP.NET作业,编程作业,管理系统,网站,app,毕业设计学习,Java学习,php学习,ASP.NET学习,java课程,php课程,ASP.NET课程,答辩技巧,SQLSERVER数据库,Mysql数据库,jdbc,SSM框架,SpringBoot框架,Html5,小程序
蓝牙串口助手,可以连接HC-05等蓝牙模块,实现单片机设备与手机通讯,安卓手机,蓝牙调试助手,具有按键功能!
TriLib 2 是一个跨平台的运行时 3D 模型导入器
人力资源+大数据+薪酬报告+涨薪调薪,在学习、工作生活中,越来越多的事务都会使用到报告,通常情况下,报告的内容含量大、篇幅较长。那么什么样的薪酬报告才是有效的呢?以下是小编精心整理的调薪申请报告,欢迎大家分享。相信老板看到这样的报告,一定会考虑涨薪的哦。