使用ASM将字节码结构转换为XML或从XML转换

时间:2014-03-13 07:24:27

标签: xml bytecode java-bytecode-asm

我一直在使用ASM做一些事情,比如使用ClassVisitor提供的ASM方法解析java类。据我所知,它也提供其他软件包,我想了解XML软件包功能,以便将bytecode结构转换为XML。能否请您提供java示例我们如何实现这一目标?

非常感谢。

〜佳日

1 个答案:

答案 0 :(得分:2)

asm-xml包的包级别有some JavaDoc。基本上它提供了ASM的访问者事件和XML SAX事件之间的双向桥梁。这允许将这些事件的流转换为XML,以及将XML处理工具(例如XSLT)连接到其中。您可以在ASM分发包或SVN的examples / xml文件夹中找到一些XSLT示例。

例如,您可以为包含源行号信息的字节码中的每个标签添加以下Java代码的等效代码:

System.err.println( "<class>.<method><desc> Line:<source line number>");

使用此XSL转换:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" encoding="ASCII" />

<xsl:template match="//method/code/Label">
  <xsl:variable name="n"><xsl:value-of select="@name"/></xsl:variable>
  <xsl:variable name="c"><xsl:value-of select="../LineNumber[@start=$n]/@line"/></xsl:variable>

  <label><xsl:apply-templates select="@*"/></label>

  <xsl:if test="string-length($c)>0">
    <xsl:comment>
      <xsl:text> Line: </xsl:text><xsl:value-of select="$c"/><xsl:text> </xsl:text>
    </xsl:comment>

    <GETSTATIC desc="Ljava/io/PrintStream;" name="err" owner="java/lang/System"/>
    <LDC desc="Ljava/lang/String;">
      <xsl:attribute name="cst">
        <xsl:value-of select="concat( /class/@name, '.' ,../../@name, ../../@desc, ' Line:', $c)"/>
      </xsl:attribute>
    </LDC>
    <INVOKEVIRTUAL desc="(Ljava/lang/String;)V" name="println" owner="java/io/PrintStream"/>
  </xsl:if>    

</xsl:template>

<!-- copy everything -->
<xsl:template match="@*|*|text()|processing-instruction()">
  <xsl:copy><xsl:apply-templates select="@*|*|text()|processing-instruction()"/></xsl:copy>
</xsl:template>

</xsl:stylesheet>

您应该可以使用以下命令运行它:

java -jar asm-all.jar code code -in <input jar> -out <output jar> -xslt <xsl>

另请查看org.objectweb.asm.xml.Processor课程的JavaDocsource code