开发者社区> 心意乱> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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);

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring中AOP相关的API及源码解析,原来AOP是这样子的(3)
Spring中AOP相关的API及源码解析,原来AOP是这样子的(3)
0 0
Spring中AOP相关的API及源码解析,原来AOP是这样子的(2)
Spring中AOP相关的API及源码解析,原来AOP是这样子的(2)
0 0
Spring中AOP相关的API及源码解析,原来AOP是这样子的(1)
Spring中AOP相关的API及源码解析,原来AOP是这样子的(1)
0 0
Spring 5 中文解析核心篇-IoC容器之Spring AOP API
本章节主要描述:Spring 5 中文解析核心篇-IoC容器之Spring AOP API。
0 0
原 SpringFramework核心技术五:Spring AOP API
一、概念 1.Spring的切入点模型使切入点重用独立于建议类型。可以使用相同的切入点来定位不同的建议。 该org.springframework.aop.Pointcut接口是中央接口,用来将通知到特定的类和方法。
1126 0
第三章 AOP 通过Java API创建切面
<p lang="zh-CN" align="JUSTIFY" style="margin-bottom:0cm; widows:0; orphans:0"><span style="color:#00000a"><span style="font-family:DejaVu Sans"><span style="font-size:10pt">    在前面使用增强的时候,我们发现增强会
912 0
第三章 AOP 通过Java API创建增强
<h3 lang="zh-CN" class="cjk"> <a name="_Toc357859968"></a><span style="font-size:12px; font-family:Calibri,serif"><span lang="en-US"><br></span></span> </h3> <h1><span style="font-size:24px"><spa
830 0
ASP.NET Core Web API 帮助页
ASP.NET Core Web API 帮助页
0 0
一文概览设计Web API 中的细节
一文概览设计Web API 中的细节
0 0
借助 Web Animations API 实现一个鼠标跟随偏移动画
借助 Web Animations API 实现一个鼠标跟随偏移动画
0 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
CUDA Math API
立即下载
阿里云 API 精选手册(Alibaba Cloud API Playbook)
立即下载
重保场景及API安全指南
立即下载