问大家一个问题,帮我解惑,JavaAgent的。
daly1987
2011-09-01
谢了,我在发个帖子问问,晚上又仔细看了一眼JDK,发现网上说的不尽其然,很多都是人云亦云。
我目前做类似于AOP的操作,就是对关注的方法进行时间统计。 我参考的是IBM上相应JavaAgent文章写的,但是加上了try。catch语句防止引起异常,导致应用失败。 主要是针对J2EE应用,我发现通过片tranform方法确实能在加载类时候添加方法片段譬如统计关注的DAO方法执行时间、或者关注的Servlet执行时间,但是对于JSP,如果你不是预编译的话,一般都是第一次访问才进行编译吧,这时候Web服务器肯定已经启动了。 因此,这就有点让人不明白了,我写的Transformer能够对其进行添加方法片段。 我本身也是由于工作需要,才涉足这里,通过1周学习,大体上对字节码的生成,ASM、BCEL有了大致的感悟,就是在这块有些疑惑。 google了以下,关于这个内容几乎没有,就是在sun的论坛上有人问过,可就是没人回答 2 楼 RednaxelaFX 7 小时前 引用 daly1987 写道 借您宝地问个问题,呵呵,希望能帮忙或者能帮着指引一下。 JavaAgent,按照JDK说法,在调用main之前调用premain,可以调用ClassFileTranform接口,进行字节码修改,这个网上的成熟例子比较多了。 最近我在做这个的时候,发现对于JSP的访问,也可以。但是在Web容器里面,对JSP访问都是在Web服务器启动后了,这时候怎么JavaAgent还能起作用呢? 望大拿帮忙分析一下。 呵呵,可以到[urlhttp://hllvm.group.iteye.com/高级语言虚拟机群组[/url]去问的,相信关注那个群组的人也有了解这些内容的 (^_^) 我有可能一忙会漏看东西⋯⋯ 针对这个问题的话,你关心的代码其实并不在main方法里,而是在别的地方对吧?所以其实并不需要关注premain。类改写是可以在某个类已经加载之后进行的,可以做redefine或者retransform。限制是只能改变类的方法体而不能改变类的结构(包括继承关系、实现的接口、成员的名字个数类型等等)。 你的实际需求是怎样的呢?——请到上面提到的高级语言虚拟机群组开帖吧 1 楼 daly1987 8 小时前 引用 借您宝地问个问题,呵呵,希望能帮忙或者能帮着指引一下。 JavaAgent,按照JDK说法,在调用main之前调用premain,可以调用ClassFileTranform接口,进行字节码修改,这个网上的成熟例子比较多了。 最近我在做这个的时候,发现对于JSP的访问,也可以。但是在Web容器里面,对JSP访问都是在Web服务器启动后了,这时候怎么JavaAgent还能起作用呢? 望大拿帮忙分析一下。 |