AOP:ASM直接为类方法添加前拦截执行(区别于无损方式)
//最近学习ASM的一点总结
//首先这种方式会更新原来的class文件,总体感觉不是很好,不过其思路很是可以借鉴!!
//1、为AccountAsm类的operation方法添加 安全检查方法 ,在执行operation前执行 SecurityChecker.checkSecurity
//首先 建立SecurityChecker 和 AccountAsm 类
--------------------------------------------------------------------------------
package com.security;
public class SecurityChecker {
public static void checkSecurity() {
System.out.println("SecurityChecker.checkSecurity ...");
//TODO real security check
}
}
--------------------------------------------------------------------------------
package com.aop;
public class AccountAsm {
public void operation()
{
System.out.println("operation...");
//TODO real operation
}
}
--------------------------------------------------------------------------------
//2、然后 实现一个 methodAdapter 类,用于 修改方法
package com.aop;
import org.objectweb.asm.MethodAdapter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
public class AddSecurityCheckMethodAdapter extends MethodAdapter {
public AddSecurityCheckMethodAdapter(MethodVisitor mv) {
super(mv);
}
//com/security/SecurityChecker 此点很总要,不能写成com.security.SecurityChecker
public void visitCode() {
visitMethodInsn(Opcodes.INVOKESTATIC, "com/security/SecurityChecker",
"checkSecurity", "()V");
}
}
}
//3、再然后实现一个ClassAdapter 用于判断 何时修改AccountAsm 类方法
package com.aop;
import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
public class AddSecurityCheckClassAdapter extends ClassAdapter
{
public String enhancedSuperName;
public AddSecurityCheckClassAdapter(ClassVisitor cv) {
//Responsechain 的下一个 ClassVisitor,这里我们将传入 ClassWriter,
// 负责改写后代码的输出
super(cv);
}
// 重写 visitMethod,访问到 "operation" 方法时,
// 给出自定义 MethodVisitor,实际改写方法内容
public MethodVisitor visitMethod(final int access, final String name,
final String desc, final String signature, final String[] exceptions) {
MethodVisitor mv = cv.visitMethod(access, name, desc, signature,exceptions);
MethodVisitor wrappedMv = mv;
if (mv != null) {
// 对于 "operation" 方法
if (name.equals("operation")) {
// 使用自定义 MethodVisitor,实际改写方法内容
wrappedMv = new AddSecurityCheckMethodAdapter(mv);
} }
return wrappedMv;
}
}
//4、读取原来的AccountAsm.class文件,并为operation方法前添加SecurityChecker.checkSecurity(),然后 生产新的class文件
public static void main(String[] args) throws Exception {
ClassReader cr = new ClassReader("com.aop.AccountAsm");
ClassWriter cw = new ClassWriter(true);
ClassAdapter classAdapter = new AddSecurityCheckClassAdapter(cw);
cr.accept(classAdapter, true);
byte[] data = cw.toByteArray();
String classPath = (
AccountAsm.class.getResource("/").toString() +
AccountAsm.class.getCanonicalName().replace(".", File.separator)+
".class"
).substring(6)
;
File file = new File(classPath);
FileOutputStream fout = new FileOutputStream(file);
fout.write(data);
fout.close();
}
//完成
- UI线程中调用Handler.post与直接执行方法的区别
- activiti学习--13:组任务分配方式1直接方式+查询正在执行的任务办理人表+查询历史任务的办理人表+拾取任务+将个人任务回退到组任务+向组任务中添加/删除成员
- Spring AOP及MethodInterceptor拦截器实现方法拦截以及切入点函数阻止执行
- 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结
- 为什么我们调用start()方法时会执行run()方法?为什么我们不能直接调用run()方法?他们之间有什么区别?
- 使用在控制器中的方法上添加注解的方式来对添加注解的方法执行前做一些预处理操作或者后处理操作
- 拦截器、执行-拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。-by小雨
- 通过对象或者类名直接调用方法的方式区别
- java将属性设置为私有,在给其添加get/set方法和直接把属性设置成public有什么区别
- SpringAOP注解方式监控方法执行情况
- Spring aop拦截springmvc的controller请求方法,添加日志和统计方法执行时间
- 使用AOP的方式监测方法执行耗时
- spring+springmvc添加aop不执行的解决方法
- Asm实现静态AOP的两种方式-在进入方法和限出方法时注入代码实现aop代码增强
- Spring AOP 各种拦截方法执行的顺序
- Spring aop 注解方式怎么获得执行了目标的某个方法?
- Spring aop 注解方式怎么获得执行了目标的某个方法?
- 说说Android 两种为自定义组件添加属性的使用方法和区别
- opensession()和getCurrentSession()方法的区别(JTA(java Transaction Api,分布式事务)事务和Connection事务:数据库自带的事务处理方式)
- 说说Android 两种为自定义组件添加属性的使用方法和区别