⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asmcontenthandler.java

📁 asm的源码包 并且包含英文的文档
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
/***
 * ASM XML Adapter
 * Copyright (c) 2004, Eugene Kuleshov
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the copyright holders nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */
package org.objectweb.asm.xml;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Label;
import org.objectweb.asm.Type;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * A {@link org.xml.sax.ContentHandler ContentHandler} that transforms XML
 * document into Java class file. This class can be feeded by any kind of SAX
 * 2.0 event producers, e.g. XML parser, XSLT or XPath engines, or custom code.
 * 
 * @see org.objectweb.asm.xml.SAXClassAdapter
 * @see org.objectweb.asm.xml.Processor
 * 
 * @author Eugene Kuleshov
 */
public class ASMContentHandler extends DefaultHandler implements Opcodes {

    /**
     * Stack of the intermediate processing contexts.
     */
    private final List stack = new ArrayList();

    /**
     * Complete name of the current element.
     */
    private String match = "";

    /**
     * <tt>true</tt> if the maximum stack size and number of local variables
     * must be automatically computed.
     */
    protected boolean computeMax;

    /**
     * Output stream to write result bytecode.
     */
    protected OutputStream os;

    /**
     * Current instance of the {@link ClassWriter ClassWriter} used to write
     * class bytecode.
     */
    protected ClassWriter cw;

    /**
     * Map of the active {@link Label Label} instances for current method.
     */
    protected HashMap labels;

    private static final String BASE = "class";

    private final RuleSet RULES = new RuleSet();
    {
        RULES.add(BASE, new ClassRule());
        RULES.add(BASE + "/interfaces/interface", new InterfaceRule());
        RULES.add(BASE + "/interfaces", new InterfacesRule());
        RULES.add(BASE + "/outerclass", new OuterClassRule());
        RULES.add(BASE + "/innerclass", new InnerClassRule());
        RULES.add(BASE + "/source", new SourceRule());
        RULES.add(BASE + "/field", new FieldRule());

        RULES.add(BASE + "/method", new MethodRule());
        RULES.add(BASE + "/method/exceptions/exception", new ExceptionRule());
        RULES.add(BASE + "/method/exceptions", new ExceptionsRule());

        RULES.add(BASE + "/method/annotationDefault",
                new AnnotationDefaultRule());

        RULES.add(BASE + "/method/code/*", new OpcodesRule()); // opcodes

        RULES.add(BASE + "/method/code/frame", new FrameRule());
        RULES.add(BASE + "/method/code/frame/local", new FrameTypeRule());
        RULES.add(BASE + "/method/code/frame/stack", new FrameTypeRule());

        RULES.add(BASE + "/method/code/TABLESWITCH", new TableSwitchRule());
        RULES.add(BASE + "/method/code/TABLESWITCH/label",
                new TableSwitchLabelRule());
        RULES.add(BASE + "/method/code/LOOKUPSWITCH", new LookupSwitchRule());
        RULES.add(BASE + "/method/code/LOOKUPSWITCH/label",
                new LookupSwitchLabelRule());

        RULES.add(BASE + "/method/code/Label", new LabelRule());
        RULES.add(BASE + "/method/code/TryCatch", new TryCatchRule());
        RULES.add(BASE + "/method/code/LineNumber", new LineNumberRule());
        RULES.add(BASE + "/method/code/LocalVar", new LocalVarRule());
        RULES.add(BASE + "/method/code/Max", new MaxRule());

        RULES.add("*/annotation", new AnnotationRule());
        RULES.add("*/parameterAnnotation", new AnnotationParameterRule());
        RULES.add("*/annotationValue", new AnnotationValueRule());
        RULES.add("*/annotationValueAnnotation",
                new AnnotationValueAnnotationRule());
        RULES.add("*/annotationValueEnum", new AnnotationValueEnumRule());
        RULES.add("*/annotationValueArray", new AnnotationValueArrayRule());
    };

    private static interface OpcodeGroup {
        public static final int INSN = 0;
        public static final int INSN_INT = 1;
        public static final int INSN_VAR = 2;
        public static final int INSN_TYPE = 3;
        public static final int INSN_FIELD = 4;
        public static final int INSN_METHOD = 5;
        public static final int INSN_JUMP = 6;
        public static final int INSN_LDC = 7;
        public static final int INSN_IINC = 8;
        public static final int INSN_MULTIANEWARRAY = 9;
    }

    /**
     * Map of the opcode names to opcode and opcode group
     */
    static final HashMap OPCODES = new HashMap();
    static {
        OPCODES.put("NOP", new Opcode(NOP, OpcodeGroup.INSN));
        OPCODES.put("ACONST_NULL", new Opcode(ACONST_NULL, OpcodeGroup.INSN));
        OPCODES.put("ICONST_M1", new Opcode(ICONST_M1, OpcodeGroup.INSN));
        OPCODES.put("ICONST_0", new Opcode(ICONST_0, OpcodeGroup.INSN));
        OPCODES.put("ICONST_1", new Opcode(ICONST_1, OpcodeGroup.INSN));
        OPCODES.put("ICONST_2", new Opcode(ICONST_2, OpcodeGroup.INSN));
        OPCODES.put("ICONST_3", new Opcode(ICONST_3, OpcodeGroup.INSN));
        OPCODES.put("ICONST_4", new Opcode(ICONST_4, OpcodeGroup.INSN));
        OPCODES.put("ICONST_5", new Opcode(ICONST_5, OpcodeGroup.INSN));
        OPCODES.put("LCONST_0", new Opcode(LCONST_0, OpcodeGroup.INSN));
        OPCODES.put("LCONST_1", new Opcode(LCONST_1, OpcodeGroup.INSN));
        OPCODES.put("FCONST_0", new Opcode(FCONST_0, OpcodeGroup.INSN));
        OPCODES.put("FCONST_1", new Opcode(FCONST_1, OpcodeGroup.INSN));
        OPCODES.put("FCONST_2", new Opcode(FCONST_2, OpcodeGroup.INSN));
        OPCODES.put("DCONST_0", new Opcode(DCONST_0, OpcodeGroup.INSN));
        OPCODES.put("DCONST_1", new Opcode(DCONST_1, OpcodeGroup.INSN));
        OPCODES.put("BIPUSH", new Opcode(BIPUSH, OpcodeGroup.INSN_INT));
        OPCODES.put("SIPUSH", new Opcode(SIPUSH, OpcodeGroup.INSN_INT));
        OPCODES.put("LDC", new Opcode(LDC, OpcodeGroup.INSN_LDC));
        OPCODES.put("ILOAD", new Opcode(ILOAD, OpcodeGroup.INSN_VAR));
        OPCODES.put("LLOAD", new Opcode(LLOAD, OpcodeGroup.INSN_VAR));
        OPCODES.put("FLOAD", new Opcode(FLOAD, OpcodeGroup.INSN_VAR));
        OPCODES.put("DLOAD", new Opcode(DLOAD, OpcodeGroup.INSN_VAR));
        OPCODES.put("ALOAD", new Opcode(ALOAD, OpcodeGroup.INSN_VAR));
        OPCODES.put("IALOAD", new Opcode(IALOAD, OpcodeGroup.INSN));
        OPCODES.put("LALOAD", new Opcode(LALOAD, OpcodeGroup.INSN));
        OPCODES.put("FALOAD", new Opcode(FALOAD, OpcodeGroup.INSN));
        OPCODES.put("DALOAD", new Opcode(DALOAD, OpcodeGroup.INSN));
        OPCODES.put("AALOAD", new Opcode(AALOAD, OpcodeGroup.INSN));
        OPCODES.put("BALOAD", new Opcode(BALOAD, OpcodeGroup.INSN));
        OPCODES.put("CALOAD", new Opcode(CALOAD, OpcodeGroup.INSN));
        OPCODES.put("SALOAD", new Opcode(SALOAD, OpcodeGroup.INSN));
        OPCODES.put("ISTORE", new Opcode(ISTORE, OpcodeGroup.INSN_VAR));
        OPCODES.put("LSTORE", new Opcode(LSTORE, OpcodeGroup.INSN_VAR));
        OPCODES.put("FSTORE", new Opcode(FSTORE, OpcodeGroup.INSN_VAR));
        OPCODES.put("DSTORE", new Opcode(DSTORE, OpcodeGroup.INSN_VAR));
        OPCODES.put("ASTORE", new Opcode(ASTORE, OpcodeGroup.INSN_VAR));
        OPCODES.put("IASTORE", new Opcode(IASTORE, OpcodeGroup.INSN));
        OPCODES.put("LASTORE", new Opcode(LASTORE, OpcodeGroup.INSN));
        OPCODES.put("FASTORE", new Opcode(FASTORE, OpcodeGroup.INSN));
        OPCODES.put("DASTORE", new Opcode(DASTORE, OpcodeGroup.INSN));
        OPCODES.put("AASTORE", new Opcode(AASTORE, OpcodeGroup.INSN));
        OPCODES.put("BASTORE", new Opcode(BASTORE, OpcodeGroup.INSN));
        OPCODES.put("CASTORE", new Opcode(CASTORE, OpcodeGroup.INSN));
        OPCODES.put("SASTORE", new Opcode(SASTORE, OpcodeGroup.INSN));
        OPCODES.put("POP", new Opcode(POP, OpcodeGroup.INSN));
        OPCODES.put("POP2", new Opcode(POP2, OpcodeGroup.INSN));
        OPCODES.put("DUP", new Opcode(DUP, OpcodeGroup.INSN));
        OPCODES.put("DUP_X1", new Opcode(DUP_X1, OpcodeGroup.INSN));
        OPCODES.put("DUP_X2", new Opcode(DUP_X2, OpcodeGroup.INSN));
        OPCODES.put("DUP2", new Opcode(DUP2, OpcodeGroup.INSN));
        OPCODES.put("DUP2_X1", new Opcode(DUP2_X1, OpcodeGroup.INSN));
        OPCODES.put("DUP2_X2", new Opcode(DUP2_X2, OpcodeGroup.INSN));
        OPCODES.put("SWAP", new Opcode(SWAP, OpcodeGroup.INSN));
        OPCODES.put("IADD", new Opcode(IADD, OpcodeGroup.INSN));
        OPCODES.put("LADD", new Opcode(LADD, OpcodeGroup.INSN));
        OPCODES.put("FADD", new Opcode(FADD, OpcodeGroup.INSN));
        OPCODES.put("DADD", new Opcode(DADD, OpcodeGroup.INSN));
        OPCODES.put("ISUB", new Opcode(ISUB, OpcodeGroup.INSN));
        OPCODES.put("LSUB", new Opcode(LSUB, OpcodeGroup.INSN));
        OPCODES.put("FSUB", new Opcode(FSUB, OpcodeGroup.INSN));
        OPCODES.put("DSUB", new Opcode(DSUB, OpcodeGroup.INSN));
        OPCODES.put("IMUL", new Opcode(IMUL, OpcodeGroup.INSN));
        OPCODES.put("LMUL", new Opcode(LMUL, OpcodeGroup.INSN));
        OPCODES.put("FMUL", new Opcode(FMUL, OpcodeGroup.INSN));
        OPCODES.put("DMUL", new Opcode(DMUL, OpcodeGroup.INSN));
        OPCODES.put("IDIV", new Opcode(IDIV, OpcodeGroup.INSN));
        OPCODES.put("LDIV", new Opcode(LDIV, OpcodeGroup.INSN));
        OPCODES.put("FDIV", new Opcode(FDIV, OpcodeGroup.INSN));
        OPCODES.put("DDIV", new Opcode(DDIV, OpcodeGroup.INSN));
        OPCODES.put("IREM", new Opcode(IREM, OpcodeGroup.INSN));
        OPCODES.put("LREM", new Opcode(LREM, OpcodeGroup.INSN));
        OPCODES.put("FREM", new Opcode(FREM, OpcodeGroup.INSN));
        OPCODES.put("DREM", new Opcode(DREM, OpcodeGroup.INSN));
        OPCODES.put("INEG", new Opcode(INEG, OpcodeGroup.INSN));
        OPCODES.put("LNEG", new Opcode(LNEG, OpcodeGroup.INSN));
        OPCODES.put("FNEG", new Opcode(FNEG, OpcodeGroup.INSN));
        OPCODES.put("DNEG", new Opcode(DNEG, OpcodeGroup.INSN));
        OPCODES.put("ISHL", new Opcode(ISHL, OpcodeGroup.INSN));
        OPCODES.put("LSHL", new Opcode(LSHL, OpcodeGroup.INSN));
        OPCODES.put("ISHR", new Opcode(ISHR, OpcodeGroup.INSN));
        OPCODES.put("LSHR", new Opcode(LSHR, OpcodeGroup.INSN));
        OPCODES.put("IUSHR", new Opcode(IUSHR, OpcodeGroup.INSN));
        OPCODES.put("LUSHR", new Opcode(LUSHR, OpcodeGroup.INSN));
        OPCODES.put("IAND", new Opcode(IAND, OpcodeGroup.INSN));
        OPCODES.put("LAND", new Opcode(LAND, OpcodeGroup.INSN));
        OPCODES.put("IOR", new Opcode(IOR, OpcodeGroup.INSN));
        OPCODES.put("LOR", new Opcode(LOR, OpcodeGroup.INSN));
        OPCODES.put("IXOR", new Opcode(IXOR, OpcodeGroup.INSN));
        OPCODES.put("LXOR", new Opcode(LXOR, OpcodeGroup.INSN));
        OPCODES.put("IINC", new Opcode(IINC, OpcodeGroup.INSN_IINC));
        OPCODES.put("I2L", new Opcode(I2L, OpcodeGroup.INSN));
        OPCODES.put("I2F", new Opcode(I2F, OpcodeGroup.INSN));
        OPCODES.put("I2D", new Opcode(I2D, OpcodeGroup.INSN));
        OPCODES.put("L2I", new Opcode(L2I, OpcodeGroup.INSN));
        OPCODES.put("L2F", new Opcode(L2F, OpcodeGroup.INSN));
        OPCODES.put("L2D", new Opcode(L2D, OpcodeGroup.INSN));
        OPCODES.put("F2I", new Opcode(F2I, OpcodeGroup.INSN));
        OPCODES.put("F2L", new Opcode(F2L, OpcodeGroup.INSN));
        OPCODES.put("F2D", new Opcode(F2D, OpcodeGroup.INSN));
        OPCODES.put("D2I", new Opcode(D2I, OpcodeGroup.INSN));
        OPCODES.put("D2L", new Opcode(D2L, OpcodeGroup.INSN));
        OPCODES.put("D2F", new Opcode(D2F, OpcodeGroup.INSN));
        OPCODES.put("I2B", new Opcode(I2B, OpcodeGroup.INSN));
        OPCODES.put("I2C", new Opcode(I2C, OpcodeGroup.INSN));
        OPCODES.put("I2S", new Opcode(I2S, OpcodeGroup.INSN));
        OPCODES.put("LCMP", new Opcode(LCMP, OpcodeGroup.INSN));
        OPCODES.put("FCMPL", new Opcode(FCMPL, OpcodeGroup.INSN));
        OPCODES.put("FCMPG", new Opcode(FCMPG, OpcodeGroup.INSN));
        OPCODES.put("DCMPL", new Opcode(DCMPL, OpcodeGroup.INSN));
        OPCODES.put("DCMPG", new Opcode(DCMPG, OpcodeGroup.INSN));
        OPCODES.put("IFEQ", new Opcode(IFEQ, OpcodeGroup.INSN_JUMP));
        OPCODES.put("IFNE", new Opcode(IFNE, OpcodeGroup.INSN_JUMP));
        OPCODES.put("IFLT", new Opcode(IFLT, OpcodeGroup.INSN_JUMP));
        OPCODES.put("IFGE", new Opcode(IFGE, OpcodeGroup.INSN_JUMP));
        OPCODES.put("IFGT", new Opcode(IFGT, OpcodeGroup.INSN_JUMP));
        OPCODES.put("IFLE", new Opcode(IFLE, OpcodeGroup.INSN_JUMP));
        OPCODES.put("IF_ICMPEQ", new Opcode(IF_ICMPEQ, OpcodeGroup.INSN_JUMP));
        OPCODES.put("IF_ICMPNE", new Opcode(IF_ICMPNE, OpcodeGroup.INSN_JUMP));
        OPCODES.put("IF_ICMPLT", new Opcode(IF_ICMPLT, OpcodeGroup.INSN_JUMP));
        OPCODES.put("IF_ICMPGE", new Opcode(IF_ICMPGE, OpcodeGroup.INSN_JUMP));
        OPCODES.put("IF_ICMPGT", new Opcode(IF_ICMPGT, OpcodeGroup.INSN_JUMP));
        OPCODES.put("IF_ICMPLE", new Opcode(IF_ICMPLE, OpcodeGroup.INSN_JUMP));
        OPCODES.put("IF_ACMPEQ", new Opcode(IF_ACMPEQ, OpcodeGroup.INSN_JUMP));
        OPCODES.put("IF_ACMPNE", new Opcode(IF_ACMPNE, OpcodeGroup.INSN_JUMP));
        OPCODES.put("GOTO", new Opcode(GOTO, OpcodeGroup.INSN_JUMP));
        OPCODES.put("JSR", new Opcode(JSR, OpcodeGroup.INSN_JUMP));
        OPCODES.put("RET", new Opcode(RET, OpcodeGroup.INSN_VAR));
        OPCODES.put("IRETURN", new Opcode(IRETURN, OpcodeGroup.INSN));
        OPCODES.put("LRETURN", new Opcode(LRETURN, OpcodeGroup.INSN));
        OPCODES.put("FRETURN", new Opcode(FRETURN, OpcodeGroup.INSN));
        OPCODES.put("DRETURN", new Opcode(DRETURN, OpcodeGroup.INSN));
        OPCODES.put("ARETURN", new Opcode(ARETURN, OpcodeGroup.INSN));
        OPCODES.put("RETURN", new Opcode(RETURN, OpcodeGroup.INSN));
        OPCODES.put("GETSTATIC", new Opcode(GETSTATIC, OpcodeGroup.INSN_FIELD));
        OPCODES.put("PUTSTATIC", new Opcode(PUTSTATIC, OpcodeGroup.INSN_FIELD));
        OPCODES.put("GETFIELD", new Opcode(GETFIELD, OpcodeGroup.INSN_FIELD));
        OPCODES.put("PUTFIELD", new Opcode(PUTFIELD, OpcodeGroup.INSN_FIELD));
        OPCODES.put("INVOKEVIRTUAL", new Opcode(INVOKEVIRTUAL,
                OpcodeGroup.INSN_METHOD));
        OPCODES.put("INVOKESPECIAL", new Opcode(INVOKESPECIAL,
                OpcodeGroup.INSN_METHOD));
        OPCODES.put("INVOKESTATIC", new Opcode(INVOKESTATIC,
                OpcodeGroup.INSN_METHOD));
        OPCODES.put("INVOKEINTERFACE", new Opcode(INVOKEINTERFACE,
                OpcodeGroup.INSN_METHOD));
        OPCODES.put("NEW", new Opcode(NEW, OpcodeGroup.INSN_TYPE));
        OPCODES.put("NEWARRAY", new Opcode(NEWARRAY, OpcodeGroup.INSN_INT));
        OPCODES.put("ANEWARRAY", new Opcode(ANEWARRAY, OpcodeGroup.INSN_TYPE));
        OPCODES.put("ARRAYLENGTH", new Opcode(ARRAYLENGTH, OpcodeGroup.INSN));
        OPCODES.put("ATHROW", new Opcode(ATHROW, OpcodeGroup.INSN));
        OPCODES.put("CHECKCAST", new Opcode(CHECKCAST, OpcodeGroup.INSN_TYPE));
        OPCODES.put("INSTANCEOF", new Opcode(INSTANCEOF, OpcodeGroup.INSN_TYPE));
        OPCODES.put("MONITORENTER", new Opcode(MONITORENTER, OpcodeGroup.INSN));
        OPCODES.put("MONITOREXIT", new Opcode(MONITOREXIT, OpcodeGroup.INSN));
        OPCODES.put("MULTIANEWARRAY", new Opcode(MULTIANEWARRAY,
                OpcodeGroup.INSN_MULTIANEWARRAY));
        OPCODES.put("IFNULL", new Opcode(IFNULL, OpcodeGroup.INSN_JUMP));
        OPCODES.put("IFNONNULL", new Opcode(IFNONNULL, OpcodeGroup.INSN_JUMP));
    }

    private static final HashMap TYPES = new HashMap();
    static {
        String[] types = SAXCodeAdapter.TYPES;
        for (int i = 0; i < types.length; i++) {
            TYPES.put(types[i], new Integer(i));
        }
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -