aop 框架底层的 Javassist API
- javassist 可以实现 java 的动态性
- 比如在 java 程序运行时, 动态的添加新方法修改类结构
- 该类 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);

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
关于hashmap不得不提
总结什么的就不了,都太多了,不过很多都不太严谨或者不太准确,以当中的一些点提出说一下。只相信源码。 桶数组长度取2的次方的直接原因:将取模运算优化为做和length-1的与运算,并在此情况下,因为length-1二进制位全为1,求index的结果会等同于hashcode的后n位,也就是可以认为,只要hashcode本身是均匀的,那么hash算法结果也是均匀的。 要点:不是为了减少碰撞把长度取为2的次方,而是如果要用与运算,一定要是2的n次方,如果是为了减少碰撞,那么取素数才是最有效的。这里主要是运算的优化 关于JDK1.7put头插法,扩容头插法,1.8put尾插法,扩容头插法,也没几个说明白,博客什么的都好像差不多(你懂得),尾插法可以让resize后链表不发生反转,真的是这样吗?看过源码后,原来都在瞎xx说。(链表反转不会对链表产
- 下一篇
Scrapyd使用教程
先上github地址:Scrapyd Scrapyd是一个服务,用来运行scrapy爬虫的 它允许你部署你的scrapy项目以及通过HTTP JSON的方式控制你的爬虫 官方文档:http://scrapyd.readthedocs.org/ 安装 pip install scrapyd 安装完成后,在你当前的python环境根目录C:\Program Files\Python35\Scripts下,有一个scrapyd.exe, 打开命令行,输入scrapyd,如下图: image.png 这样scrapyd就运行起来了,访问127.0.0.1:6800即可看到可视化界面。 注:如果在命令行运行scrapyd报错如下图: image.png 先pip list 查看你的attrs这个包的版本 然后降到16.3 再试试,如果还不行,请评论区提问。 理解scrapyd scrapyd其实就是一个服务器端,真正在部署爬虫的时候,我们需要两个东西: scrapyd (安装在服务器端) scrapy-client (客户端) scrapy-client,它允许我们将本地的scrapy项目打包发...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Hadoop3单机部署,实现最简伪集群
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7,8上快速安装Gitea,搭建Git服务器