java项目源码哪里找(java初学者练手项目)

java项目源码哪里找(java初学者练手项目)

  为什么会接触JavaAgent呢?

  这起源于笔者最近在读Dubbo的源码,Dubbo有一个很有意思的功能——SPI,它可以根据运行时的URI参数,自适应的调用特定的实现类。大致的原理其实也能猜到,无非就是生成一个代理类,反射解析URI参数里的值,然后再调用对应的实现类。虽然大概可以猜到实现原理,但毕竟只是猜想,抱着科学严谨的精神,还是想看看Dubbo的实现源码,此时就有了一个想法,能不能把Dubbo生成的代理对象的Class类Dump下来,然后反编译看看它的源码呢?

  理论上是完全可行的,阿里有一个很好用的开源工具Arthas,它的jad命令就支持对JVM已经加载的类进行反编译查看源码,笔者把Arthas项目源码down下来了,查看以后发现,需要用到JavaAgent技术。

  在JDK1.5以后,我们可以使用JavaAgent技术,以「零侵入」的方式对Java程序做增强。例如阿里云的Arms应用监控服务,就可以通过JavaAgent的方式接入一个探针,它会把应用的运行数据上报到阿里云,开发者可以在后台查看到应用的运行数据。这种方式,不需要我们对应用做任何改动,就可以轻松实现应用监控。

  JavaAgent是一种规范,它分为两类:主程序运行前Agent、主程序运行后Agent。它可以在JVM加载Class文件前,对字节码做修改,甚至允许修改已经加载过的Class,这样我们就可以对应用做增强、以及实现代码热部署。

  主程序运行前Agent的步骤:

  1、编写Agent类,该类必须有静态方法premain()。

  2、在resources/META-INF目录下编写MANIFEST.MF文件,指定Premain-Class,然后将程序打成Jar包。

  使用Maven构建程序时,也可使用如下配置。

  3、启动目标程序时,指定JVM参数,如下:

  主程序运行后Agent的步骤:

  这种是针对已经运行的JVM进程,我们可以通过attach机制,启动一个新的JVM进程发送指令给它执行。

  1、编写Agent类,该类必须有静态方法agentmain()。

  2、在resources/META-INF目录下编写MANIFEST.MF文件,指定Premain-Class,然后将程序打成Jar包。

  3、编写attach程序,启动并attach到目标JVM进程。

  编写的AgentClass类必须有premain()方法,其中一个比较重要的参数就是Instrumentation。它是JavaAgent技术用到的主要API,接口定义如下:

  重要的方法笔者已经写上注释了,本文会用到的方法主要是addTransformer()。它可以用来添加Class转换器,JVM在加载Class前,会先经过这些转换器进行加工。

  Class文件转换器,JVM加载某个Class前,会先经过它转换,我们可以在这里去修改字节码以达到功能增强的目的。它只有一个方法transform():

  本文主要用到的就是classfileBuffer,有了Class的字节数组,只要把它导出到磁盘,通过IDEA反编译就能看到源码了。

  【需求】

  支持将任意Java对象的Class文件导出到磁盘,通过反编译查看源码,包括动态生成的类。

  【实现】

  1、编写InstrumentationHolder,持有Instrumentation实例,后续操作全靠它。

  2、编写MyAgentClass,保存Instrumentation实例。

  3、编写ClassDumpTransformer,获取Class文件字节数组,导出到磁盘。

  4、编写ClassUtil工具类,支持导出Class文件。

  5、编写MANIFEST.MF文件,构建Jar包。

  6、编写测试类,利用JDK动态代理生成代理类,然后将代理类的Class文件导出。

  7、设置-javaagent参数并启动程序。

  此时,target目录下就会生成X.class文件,通过IDEA打开即可看到JDK生成的代理类源码。

  JavaAgent十分强大,通过它可以在JVM加载Class文件前修改字节码,甚至修改JVM已经加载的Class。基于此,我们可以「零侵入」的对应用程序做增强,服务实现热部署等等。

  本文通过一个小示例,编写ClassFileTransformer实现类导出对象的Class文件,反编译查看其源码。这对于ASM操作字节码、JDK动态代理等动态生成类的场景下,而我们又想看对象的具体实现时,提供了帮助。

推荐阅读

    opporeno8参数配置及价格

    opporeno8参数配置及价格,面部,亿元,Oppo的荣誉2020年1月4日,接近屏幕关闭传感器是否支持双卡:支持oppor11splus什么时候上市的Oppo R11S P

    魅蓝note6性能参数有哪些

    魅蓝note6性能参数有哪些,摄像头,蓝牙,魅蓝note6性能参数有哪些魅力蓝色Note6最好拍照。电池寿命更长。蓝色Note6使用高通 snapdragon 625

    设置总账参数|用友u8设置总账参数

    设置总账参数|用友u8设置总账参数,,1. 用友u8设置总账参数1、首先要点开数据权限控制设置;2、选择想要设置控制的单据;3、打开后看到左上角

    联想垫a2207如何调用a2207平板评价

    联想垫a2207如何调用a2207平板评价,,联想a2207垫在1600 3G双网双待平板电脑的位置。作为以前的热门产品a2107升级版,a2207处理器取得了可观

    csgo参数设置|csgo怎么保存

    csgo参数设置|csgo怎么保存,,csgo怎么保存第一步下载csgo的官方版本。然后再下载一个5e对战平台,PS:5e的账号和csgo的账号不是一个账号。第

    移动apn设置|移动apn设置参数

    移动apn设置|移动apn设置参数,,移动apn设置参数1、打开手机系统设置界面应用,点击页面中的“移动网络”设置选项。2、进入移动网络设置页面

    均线最佳设置|均线最佳参数设置

    均线最佳设置|均线最佳参数设置,,1. 均线最佳参数设置所有指标包括kd macd均线,是根据已有价格计算得出,看指标落后于看价格分析,也就是k线。