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

📄 codeattribute.java

📁 已经移植好的java虚拟机
💻 JAVA
字号:
/* *  Copyright (c) 2000 Sun Microsystems, Inc., 901 San Antonio Road, *  Palo Alto, CA 94303, U.S.A.  All Rights Reserved. * *  Sun Microsystems, Inc. has intellectual property rights relating *  to the technology embodied in this software.  In particular, and *  without limitation, these intellectual property rights may include *  one or more U.S. patents, foreign patents, or pending *  applications.  Sun, Sun Microsystems, the Sun logo, Java, KJava, *  and all Sun-based and Java-based marks are trademarks or *  registered trademarks of Sun Microsystems, Inc.  in the United *  States and other countries. * *  This software is distributed under licenses restricting its use, *  copying, distribution, and decompilation.  No part of this *  software may be reproduced in any form by any means without prior *  written authorization of Sun and its licensors, if any. * *  FEDERAL ACQUISITIONS:  Commercial Software -- Government Users *  Subject to Standard License Terms and Conditions */package kdp.classparser.attributes;import kdp.classparser.attributes.*;import kdp.classparser.constantpoolclasses.*;import java.io.*;/** * Encapsulates the Code attribute of a Java class file. * * @author 			Aaron Dietrich * @version			$Id: CodeAttribute.java,v 1.2 2000/08/14 19:49:11 zmm3876 Exp $ * * Revision History *   $Log: CodeAttribute.java,v $ *   Revision 1.2  2000/08/14 19:49:11  zmm3876 *   *** empty log message *** * *   Revision 1.1  2000/08/09 15:51:44  zmm3876 *   *** empty log message *** * *   Revision 1.1.1.1  2000/07/07 13:34:23  jrv *   Initial import of kdp code * *   Revision 1.1.1.1  2000/05/31 19:14:47  ritsun *   Initial import of kvmdt to CVS * *   Revision 1.1  2000/04/25 00:30:39  ritsun *   Initial revision * */public class CodeAttribute extends Attribute  {   /** index into constant pool table containing the name        of this class */   private int					attributeNameIndex;   /** length of this attribute in bytes */   private int					attributeLength;   /** the maximum depth of the operand stack of this method */   private int					maxStack;   /** the number of local variables in the local variable        array allocated upon invocation of this method */   private int					maxLocals;   /** the number of bytes in the code array for this method */   private int					codeLength;   /** the bytes of Java virtual machine code that implement a method */   private byte				code[];   /** the number of entries in the exceptionTable table */   private int					exceptionTableLength;   /** each entry describes one exception handler in the code array */   private ExceptionTable     	exceptionTable[];   /** the number of attributes of the Code attribute */   private int					attributesCount;   /** array of attributes for this CodeAttribute */   private AttributeInfo	          attributes[];   /**    * Constructor.  Reads the CodeAttribute attribute from    * the class file.    *    * @param		iStream			the input stream on which to read    *                                   the class file    * @param		constantPool		constant pool of the class file    * @param		attributeNameIndex	attributeNameIndex member of    *							attribute structure.    * @param		attributeLength	attributeLength member of    *							attribute structure.    *    * @exception	IOException		pass IOExceptions up    */   public CodeAttribute (DataInputStream iStream,                         final ConstantPoolInfo[] constantPool,   					int attributeNameIndex, int attributeLength)                                                            throws IOException     {      this.attributeNameIndex = attributeNameIndex;      this.attributeLength = attributeLength;      //read in the maxStack and maxLocals items      maxStack = iStream.readUnsignedShort ();      maxLocals = iStream.readUnsignedShort ();      //read in the length of the code array      codeLength = iStream.readInt ();            //allocate space for and read in the code array      code = new byte[codeLength];      for (int lcv=0; lcv < codeLength; ++lcv)        code[lcv] = iStream.readByte ();            //read in the number of items in the exception table      exceptionTableLength = iStream.readUnsignedShort ();      //allocate space for and read in the exception table            exceptionTable = new ExceptionTable[exceptionTableLength];      for (int lcv=0; lcv < exceptionTableLength; ++lcv)        exceptionTable[lcv] = new ExceptionTable (iStream);            //read in the number of attributes      attributesCount = iStream.readUnsignedShort ();      //allocate space for and read in the attributes      attributes = new AttributeInfo[attributesCount];      for (int lcv=0; lcv < attributesCount; ++lcv)        attributes[lcv] = new AttributeInfo (iStream, constantPool);     }   /**    * Retrieves the line number table of this code attribute    *    * @return       LineNumberTableAttribute      this code attribute's    *                                             line number table.    */   public LineNumberTableAttribute getLineNumberTable ()     {      int           attrIndex = 0;      boolean       found = false;      //loop through this code attribute's attributes until the line number      //table is found or there are no more to look through      while ((!found) && (attrIndex < attributesCount))        {         if (attributes[attrIndex].getType () == AttributeInfo.ATTR_LINENUMBER)           found = true;         else           ++attrIndex;        }      if (found)        {//if we found the line number table return it         AttributeInfo              attrInfo = attributes[attrIndex];         LineNumberTableAttribute   lineNumberTable =                                 (LineNumberTableAttribute) attrInfo.getInfo ();         return lineNumberTable;        }      else        return null; //did not find the line number table so return null     }   /**    * Query this code attribute to see if it contains the source file    * line number specified by lineNumber.    *    * @return       boolean        true if the line number is in this code    *                              attribute, false otherwise    */   public boolean containsLine (int lineNumber)     {      //get the line number table      LineNumberTableAttribute     lines = getLineNumberTable ();      //if the line number table was found tell it to look up the line number      if (lines != null)        return (lines.containsLine (lineNumber));      else        return false; //could not find the line number table so return false     }        /**    * Returns the byte code for the method     *    * @return           byte[]       byte code    */   public byte[] getByteCodes() {       byte[] ret = new byte[ code.length ];       System.arraycopy( code, 0, ret, 0, code.length );       return ret;   }   public int getCodeLength() {       return code.length;   }   /**    * Returns the CodeAttribute attribute in a nice easy to    * read format as a string.    *    * @param		constantPool		constant pool of the class file    *    * @return 		String			the attribute as a nice easy to    *							read String    */   public String toString (final ConstantPoolInfo[] constantPool)     {      ConstantUtf8Info			utf8Info;      String					s = new String ("");      utf8Info = (ConstantUtf8Info) constantPool[attributeNameIndex];      s = s + utf8Info.toString ();      for (int lcv = 0; lcv < attributesCount; ++lcv)        s = s + "\n\t\t" + attributes[lcv].toString ();      return s;     }          public AttributeInfo[] getAttributes(){        return attributes;     }          public int getAttributeCount(){        return attributesCount;     }  }

⌨️ 快捷键说明

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