使用ASM在XML和XML之间转换字节码结构

使用ASM在XML和XML之间转换字节码结构,xml,bytecode,java-bytecode-asm,Xml,Bytecode,Java Bytecode Asm,我一直在使用ASM做一些事情,比如使用ASM提供的ClassVisitor方法解析java类。据我所知,它还提供了其他软件包,我想了解XML软件包功能,以便将字节码结构转换为XML。你能给我提供一个java示例吗?我们是如何做到这一点的 非常感谢 ~yash在asmxmlpackage的包级别上有。基本上,它在ASM的访问者事件和XMLSAX事件之间提供了一个双向桥梁。它允许将这些事件流转换为XML和XML,并将XML处理工具(如XSLT)连接到XML中。您可以在ASM分发包的examples/

我一直在使用
ASM
做一些事情,比如使用
ASM
提供的
ClassVisitor
方法解析java类。据我所知,它还提供了其他软件包,我想了解
XML
软件包功能,以便将
字节码
结构转换为
XML
。你能给我提供一个java示例吗?我们是如何做到这一点的

非常感谢

~yash

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

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

System.err.println( "<class>.<method><desc> Line:<source line number>");
<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>
System.err.println(“.Line:”);
使用此XSL转换:

System.err.println( "<class>.<method><desc> Line:<source line number>");
<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>
java-jar asm-all.jar code-code-in-out-xslt

另请看
org.objectweb.asm.xml.Processor
类的and。

我不清楚您的问题。您真的在使用汇编来解析java类吗?程序集既没有
类访问者
也没有XML包。@PMF:我想他指的是(某种Java字节码框架)。您好,thaks,我已经用ASM解析了.class及其作品。我所问的与解析无关,我想不理解这里提到的XML包提供的ASM特性-,您能解释一下它是如何工作的吗?谢谢:)@Michael:好吧,我也这么想。我已经去掉了“assembly”标签,因为它具有误导性。我仍然对这个问题感到困惑。通常,您使用XML解析器/序列化程序包来读取和写入XML。我希望你不是在说重新发明那个轮子。。。