读取class文件,解析数据流。
package readClass;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import readClass.util.UtilMap;
/**
* 模拟虚拟机解析class文件
*
* @author Administrator
*
*/
public class MyPraseClassFile
{
static char[] xIndex ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
public static void main(String[] args)
{
Map resultMap = new HashMap(); //用来记录constants中的值
Map tempMap = new HashMap();
try
{
DataInputStream stream = new DataInputStream(MyPraseClassFile.class.getResourceAsStream("exampleClass/ExampleClass.class"));
byte[] b = new byte[4];
int index = 0;
stream.read(b);
ClassBean bean = null;
System.out.println("magic----->"+convert0x(b,index,4));
System.out.println("minor_version----->"+stream.readShort());
System.out.println("major_version----->"+stream.readShort());
int constantsCountt =stream.readShort();
System.out.println("constants_pool_count----->"+constantsCountt);
List list = null; //
for(int count =1;count
{
//读取常量类型
byte tempByte = stream.readByte();
list = resultMap.get(String.valueOf(tempByte));
if(null == list)
{
list = new ArrayList();
resultMap.put(String.valueOf(tempByte),list);
}
bean = new ClassBean();
tempMap.put(String.valueOf(count), bean); //用于之后的查找
list.add(bean);
bean.setIndex(count);
bean.setTag(tempByte);
switch (tempByte)
{
case 1: short length = stream.readShort(); b = new byte[length]; stream.read(b); bean.setValue(new String(b)); break;
case 3: bean.setValue(String.valueOf(stream.readInt())); break;
case 4: bean.setValue(String.valueOf(stream.readFloat())); break;
case 5: bean.setValue(S