aop 框架底层的 Javassist API

简介: 在我们学习框架的使用经常看得到的一个 jar 包
  1. javassist 可以实现 java 的动态性
  2. 比如在 java 程序运行时, 动态的添加新方法修改类结构
  3. 该类 API 与 java.lang.Class API 相似

动态的创建一个 class 对象

ClassPool pool = ClassPool.getDefault();

/** 声明类名及包名 */
CtClass ctClass = pool.makeClass("com.znsd.javassist.Emp");

/** 创建属性 */
CtField ctField = CtField.make("private Integer id;", ctClass);
ctClass.addField(ctField);

/** 创建方法 */
CtMethod ctMethod = CtMethod.make("public Integer getId(){return id;}", ctClass);
ctClass.addMethod(ctMethod);

// 将生成好的类输出在本地磁盘上
ctClass.writeFile("F:/");
System.out.println("执行成功!");

获取类的基本信息

ClassPool classPool = ClassPool.getDefault();
        
CtClass ctClass = classPool.get("com.znsd.javassist.Student");

System.out.println("获取类路径: " + ctClass.getName());
System.out.println("获取类名: " + ctClass.getSimpleName());
System.out.println("获取父类: " + ctClass.getSuperclass());
System.out.println("获取接口: " + ctClass.getInterfaces());

动态创建方法

ClassPool classPool = ClassPool.getDefault();

CtClass ctClass = classPool.get("com.znsd.javassist.Student");

/** 声明好一个方法 */
CtMethod ctMethod = 
    CtNewMethod.make("public int add(int i, int j){return i + j;}", ctClass);

ctClass.addMethod(ctMethod);

/** 获取 Class 对象用于调用创建好的方法 */
Class classes = ctClass.toClass();

Object newInstance = classes.newInstance();
Method declaredMethod = classes.getDeclaredMethod("add", int.class, int.class);
Object result = declaredMethod.invoke(newInstance, 110, 120);

System.out.println(result);

实现 aop 编程

ClassPool classPool = ClassPool.getDefault();
CtClass ctClass = classPool.get("com.znsd.javassist.Student");

CtMethod ctMethod = ctClass.getDeclaredMethod("show");

// 在方法前插入一些代码
ctMethod.insertBefore("System.out.println(\"aop:before\");");
// 在方法后插入一些代码
ctMethod.insertAfter("System.out.println(\"aop:after\");");
// 指定在哪一行插入一些代码
ctMethod.insertAt(29, "System.out.println(\"insertAt\");");

Class classes = ctClass.toClass();
Object newInstance = classes.newInstance();
Method method = classes.getDeclaredMethod("show");
method.invoke(newInstance);
目录
相关文章
|
25天前
|
API 数据库 数据安全/隐私保护
利用Django框架构建高效后端API服务
本文将介绍如何利用Django框架构建高效的后端API服务。通过深入分析Django框架的特性和优势,结合实际案例,探讨了如何利用Django提供的强大功能来构建高性能、可扩展的后端服务。同时,还对Django框架在后端开发中的一些常见问题进行了解决方案的探讨,并提出了一些建设性的建议。
40 3
|
30天前
|
JSON Java API
Springboot项目中如何设计一个规范的统一的Restful API 响应框架?
Springboot项目中如何设计一个规范的统一的Restful API 响应框架?
22 1
|
1月前
|
XML JSON API
通过Flask框架创建灵活的、可扩展的Web Restful API服务
通过Flask框架创建灵活的、可扩展的Web Restful API服务
|
1月前
|
缓存 监控 API
Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架
Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架
57 0
|
1月前
|
JSON API 数据格式
构建高效Python Web应用:Flask框架与RESTful API设计实践
【2月更文挑战第17天】在现代Web开发中,轻量级框架与RESTful API设计成为了提升应用性能和可维护性的关键。本文将深入探讨如何使用Python的Flask框架来构建高效的Web服务,并通过具体实例分析RESTful API的设计原则及其实现过程。我们将从基本的应用架构出发,逐步介绍如何利用Flask的灵活性进行模块化开发,并结合请求处理、数据验证以及安全性考虑,打造出一个既符合标准又易于扩展的Web应用。
628 4
|
2月前
|
JSON 测试技术 API
一个数据驱动的API测试框架
一个数据驱动的API测试框架
|
3月前
|
XML 存储 Java
JAVAEE框架整合技术之Spring02-AOP面向切面编程技术
JAVAEE框架整合技术之Spring02-AOP面向切面编程技术
54 0
JAVAEE框架整合技术之Spring02-AOP面向切面编程技术
|
3月前
|
JavaScript 前端开发 IDE
Vue3【为什么选择Vue框架、Vue简介 、Vue API 风格 、Vue开发前的准备 、Vue项目目录结构 、模板语法、属性绑定 、 】(一)-全面详解(学习总结---从入门到深化)
Vue3【为什么选择Vue框架、Vue简介 、Vue API 风格 、Vue开发前的准备 、Vue项目目录结构 、模板语法、属性绑定 、 】(一)-全面详解(学习总结---从入门到深化)
49 1
|
4月前
|
存储 算法 Java
【Java 集合框架API接口】Collection,List,Set,Map,Queue,Deque
【Java 集合框架API接口】Collection,List,Set,Map,Queue,Deque