javassist简介

javassist可以对一个已经编译好了的.class文件的字节码进行改动,比如说我可以为一个类添加一个方法,添加一个属性,也可以修改一个方法等,还可以对一个方法,异常进行拦截等。
我们常用到的动态特性主要是反射,在运行时查找对象属性、方法,修改作用域,通过方法名称调用方法等。但反射的性能开销较大,Javassit是一个东京研究院开发的第三方库,提供了运行时操作Java字节码的方法。类似字节码操作方法还有ASM,几种动态编程方法相比较,在性能上Javassist高于反射,但低于ASM。
学习javassit,主要是为学习如何让已经运行中的虚拟机动态加载类做铺垫。

例子

maven 依赖

<dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.20.0-GA</version>
</dependency>

java类

Screen类

package demo7;/*** Created by enyilr on 15/10/14.*/
public class Screen {public void plus(int i, int j) {int m = i + j;System.out.println("i plus j=" + m);}}

TransClass类

package demo5;
/*** Created by enyilr on 15/10/14.*/
public class TransClass {public int getNumber() {return 2;}
}

测试类Test

public class Test {public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {ClassPool pool = ClassPool.getDefault();CtClass transClass = pool.get("demo5.TransClass");CtMethod ctm = transClass.getDeclaredMethod("getNumber");ctm.insertAfter("System.out.println(\"add down!\");");transClass.writeFile();Method m = transClass.toClass().getMethod("getNumber");TransClass transClass1 = TransClass.class.newInstance();Object invoke = m.invoke(transClass1);System.out.println(invoke);pool.importPackage("java.util.Date");CtClass screen = pool.get("demo7.Screen");CtMethod plus = screen.getDeclaredMethod("plus");plus.insertBefore("{System.out.println(\"i=\"+($1)+\",j=\"+$2);}");plus.insertAfter("System.out.println((new Date()));");screen.writeFile();Method plus1 = screen.toClass().getMethod("plus", int.class,int.class);Screen screen1 = Screen.class.newInstance();plus1.invoke(screen1,1,2);}
}

javassist 初步学习相关推荐

  1. HTMLParser的初步学习

    Python的自带模块--HTMLParser的初步学习 HTMLParser是Python自带的模块,使用简单,能够很容易的实现HTML文件的分析. 本文主要简单讲一下HTMLParser的用法. ...

  2. 初步学习pg_control文件之三

    接前文,初步学习pg_control文件之二 继续学习: 研究 DBState,先研究 DB_IN_PRODUCTION ,看它如何出现: 它出现在启动Postmaster时运行的函数处: /* * ...

  3. eclipsevue代码怎么运行_[Java教程]使用eclipse初步学习vue.js操作

    [Java教程]使用eclipse初步学习vue.js操作 0 2017-11-26 19:00:06 一.vue.js的初步认识 https://unpkg.com/vue ">vu ...

  4. json2.js的初步学习与了解(转)

    转载来源:http://apps.hi.baidu.com/share/detail/6092406 json2.js的初步学习与了解 1.)该js的下载地址是:http://www.json.org ...

  5. 【TensorFlow-serving】初步学习模型部署

    前言 初步学习tensorflow serving的手写数字识别模型部署.包括简单的模型训练.保存.部署上线.因为对docker和网络不太熟悉,可能会有部分错误,但是看完博客,能跑通整个流程.此博客将 ...

  6. 初步学习pg_control文件之八

    接前文  初步学习pg_control文件之七  继续 看:catalog_version_no 代码如下: static void WriteControlFile(void) {.../** In ...

  7. 初步学习pg_control文件之六

    接前文:初步学习pg_control文件之五 ,DB_IN_ARCHIVE_RECOVERY何时出现? 看代码:如果recovery.conf文件存在,则返回 InArchiveRecovery = ...

  8. 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助...

    初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: 1 var fs = require( ...

  9. 罗佳琪的第三次预备作业——虚拟机的安装及Linux的初步学习

    虚拟机的安装及Linux的初步学习 坎坷的安装过程 首先我按照老师给的基于VirtualBox虚拟机安装Ubuntu图文教程进行了下载,下载很顺利但是安装时出现了问题. 起初我以为是电脑位数问题,但我 ...

最新文章

  1. Nature今发表脑机接口领域重大突破:
  2. Nodejs学习笔记之复制文件
  3. Delphi 的运算符重载(2) - 可重载运算符列表
  4. 我在实际工作中用的最多的 git 命令,全在这里了,使用简单!
  5. 把手机刷成服务器系统,旧手机改成云服务器
  6. ThreadLocal介绍以及源码分析
  7. 转:线性代数知识汇总
  8. 企业如何快速应对市场环境的不断变化
  9. Google Chrome 1.0.154.46稳定版本发布 修复高危安全漏洞
  10. 苹果推送iOS13.1.3更新:iOS13发布仅一个月疯狂补Bug
  11. linux内核的队列实现移植
  12. php order不管用,php – WooCommerce – get_order()不起作用,它返回零
  13. php 取消命名空间,到PHP命名空间或不到PHP命名空间
  14. php点击按钮变文字,点击按钮文字变成input框,点击保存变成文字的实现代码
  15. atitit.nfc 身份证 银行卡 芯片卡 解决方案 attilax总结
  16. ListView刷新指定item
  17. 免费小说网站源码 主题XSnov WordPress主题
  18. pyhton爬虫爬取100首诗
  19. 豆瓣高分电影爬取项目,思路清晰,易上手,附免费代码下载
  20. 瑞吉外卖项目 基于spring Boot+mybatis-plus开发 超详细笔记,有源码链接

热门文章

  1. 第七篇:数据预处理(四) - 数据归约(PCA/EFA为例)
  2. 平民架构的春天——UCloud数据方舟实战记
  3. System.Web.Caching.Cache类 缓存 各种缓存依赖
  4. 在NewLisp中实现匿名函数的递归
  5. 一次心惊肉跳的服务器误删文件的恢复过程
  6. 用for实现Go的while和do...while
  7. sed学习系列---第3/3部分
  8. university, school, college, department, institute的区别
  9. elasticsearch 安装
  10. 全国首个窄带物联网实验局落户福州 助力智慧城市建设