//最近学习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();
}
//完成
分享到:
相关推荐
AOP 的利器:ASM 3_0 介绍,很好的书
spring aop切面拦截指定类和方法实现流程日志跟踪 一般情况下,在不侵入业务代码的情况下,需要做流程日志跟踪是比较合理的 采用springaop切面思想
java aop拦截方法类前后添加日志
项目中含有一整个springboot实现aop的功能,在拦截的方法形式上有两种一种是通过切点设置为拦截某个包路径下面的类中的所有方法;还有一种是基于某个自定义注解的.
spring aop 拦截实例,下载下来直接就可以用了,很好很方便。
aop切面拦截单个方法实例
介绍ASM的简单使用和基本原理,并对AOP的原理进行了详细的描述和总结。
Castle AOP 对类方法调用的拦截示例Deom(可运行),有3.1版的Castle.Core.dll
使用 Spring AOP 进行方法耗时监测的好处有以下几点: 1. 代码实现简单,易于维护:使用 Spring AOP 可以将耗时监测的逻辑与业务逻辑进行解耦,避免业务逻辑代码的冗余和代码维护难度的提高。 2. 安全性高:使用 ...
NULL 博文链接:https://chenhongwei0924.iteye.com/blog/845772
有人问 Sping AOP用AspectJ注解的方式拦截不到SpringMVC的controller方法? 我这里提供了一种解决方法,仅供参考
Maven坐标:org.springframework:spring-aop:5.0.10.RELEASE; 标签:spring、aop、springframework、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览...
springboot spring aop 拦截器 注解方式实现脱敏(涉及到:pom.xml -->application.properties --->启动类-->拦截器)
包含2篇attribute高级应用文章,以及相应的代码。 代码关键处,都有详细注释。 看过后,你会对attribute,context有更深刻的认识
Spring MVC AOP通过自定义注解方式拦截Controller等实现日志管理, springMVC里做添加AOP拦截,用于捕获异常。
AOP的概念也很好理解,跟中间件差不多,说白了,就是我可以任意地在方法的前面或后面添加代码,这很适合用于缓存、日志等处理。 在net core2.2时,我当时就尝试过用autofac实现aop,但这次我不想用autofac,我用了一...
Spring Mvc AOP通过注解方式拦截controller等实现日志管理
用spring写的小示例程序,拦截某一层的所有方法。可以在调用之前、之后、抛出异常拦截调用,日志打印。
System.out.println("在目标方法执行之前执行" + ", 要拦截的方法是:" + joinPoint.getSignature()); } public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable { Object[] args = ...