我一直在使用ASM
做一些事情,比如使用ClassVisitor
提供的ASM
方法解析java类。据我所知,它也提供其他软件包,我想了解XML
软件包功能,以便将bytecode
结构转换为XML
。能否请您提供java示例我们如何实现这一目标?
非常感谢。
〜佳日
答案 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
课程的JavaDoc和source code。