首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

开发一个调试 JSP 的 Eclipse 插件(2)

开发一个调试 JSP 的 Eclipse 插件(2)

JVM 规范定义了 ClassFile 中可以包含 SourceDebugExtension 属性,保存 SMAP:
1
2
3
4
5
            SourceDebugExtension_attribute {
    u2 attribute_name_index;
    u4 attribute_length;
    u1 debug_extension[attribute_length];
}




我用 javassist 做了一个测试(javassist可是一个好东东,它可以动态改变Class的结构,JBOSS 的 AOP就利用了javassist,这里我们只使用它读取ClassFile的属性)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void main(String[] args) throws Exception{
         String[]files = {
"E:\\Tomcat5_0_5\\work\\Catalina\\localhost\\_\\org\\apache\\jsp\\Hello_jsp.class",
         };
                 
for(int k = 0; k < files.length; k++){
     String file = files[k];
     System.out.println("Class : " + file);
    ClassFile classFile = new ClassFile(new DataInputStream(new FileInputStream(file)));
            
          AttributeInfo attributeInfo = classFile.getAttribute("SourceDebugExtension");
          System.out.println("attribute name :" + attributeInfo.getName() + "]\n\n");
          byte[]bytes = attributeInfo.get();
          String str = new String(bytes);
          System.out.println(str);      
        }
}




这段代码显示了SourceDebugExtension 属性,你可以看到SMAP 的内容。编译JSP后,SMAP 就被写入 Class 中, 你也可以利用 javassist 修改 ClassFile 的属性。
下面就是 Hello_jsp.class 中保存的 SMAP 内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SMAP
E:\Tomcat5_0_5\work\Catalina\localhost\_\org\apache\jsp\Hello_jsp.java
JSP
*S JSP
*F
+ 0 Hello.jsp
/Hello.jsp
+ 1 greeting.jsp
/greeting.jsp
*L
1:45
2:46
3:47
3:48
4:49
5:50
1#1:51
1:52
2:53
7#0:56
8:57
*E




首先注明JAVA代码的名称:Hello_jsp.java,然后是 stratum 名称: JSP。随后是两个JSP文件的名称  :Hello.jsp、greeting.jsp。两个JSP文件共10行,产生的Hello_jsp共69行代码。最后也是最重要的内容就是源文件文件名/行号和目标文件行号的对应关系(*L 与 *E之间的部分)
在规范定义了这样的格式:
源文件行号 # 源文件代号,重复次数 : 目标文件开始行号,目标文件行号每次增加的数量
(InputStartLine # LineFileID , RepeatCount : OutputStartLine , OutputLineIncrement)
源文件行号(InputStartLine) 目标文件开始行号(OutputStartLine) 是必须的。下面是对这个SMAP具体的说明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1:45  2:46  3:47  3:48  4:49  5:50(没有源文件代号,默认为Hello.jsp)
                                                      开始行号     结束行号
                Hello.jsp:    1 ->  Hello_jsp.java:       45
                              2 ->                     46
                              3 ->                     47           48
                              4 ->                     49
                              5 ->                     50
1#1:51  1:52  2:53(1#1表示 greeting.jsp 的第1行)
                greeting.jsp:    1 ->  Hello_jsp.java:       51           52
                              2 ->                     53
         
     7#0:56  8:57(7#0表示 Hello.jsp 的第7行)
                 Hello.jsp:     7 ->  Hello_jsp.java:       56
                              8 ->                     57

返回列表