package com.zvm.classfile;
import com.zvm.basestruct.U1;
import com.zvm.basestruct.U2;
import com.zvm.basestruct.U4;
import com.zvm.classfile.attribute.*;
import com.zvm.classfile.attribute.LocalVariableTable.LocalVariable;
import com.zvm.classfile.attribute.LocalVariableTypeTable.LocalVariableType;
import com.zvm.classfile.attribute.RuntimeVisibleParameterAnnotations.ParameterAnnotation;
import com.zvm.classfile.attribute.code.ExceptionTable;
import com.zvm.classfile.attribute.innerClasses.Classes;
import com.zvm.classfile.attribute.lineNumberTable.LineNumber;
import com.zvm.classfile.attribute.runtimeVisibleAnnotations.*;
import com.zvm.classfile.attribute.stackmaptable.*;
import com.zvm.classfile.attribute.stackmaptable.verificationtypeinfo.*;
import com.zvm.classfile.constantpool.*;
import com.zvm.utils.TypeUtils;
@SuppressWarnings("AlibabaCommentsMustBeJavadocFormat")
public class ClassFile {
public U4 magic;
public U2 minorVersion;
public U2 majorVersion;
public U2 constantPoolCount;
public CpInfo constantPool = new CpInfo();
public U2 accessFlags;
public U2 thisClass;
public U2 superClass;
public U2 interfaceCount;
public U2[] interfaces;
public U2 fieldCount;
public FieldInfo[] fields ;
public U2 methodsCount;
public MethodInfo[] methods ;
public U2 attributesCount;
public AttributeBase[] attributes ;
/**
* 将字节码转换为ClassFile
* @param bytecode
*/
public void processByteCode(byte[] bytecode){
IOUtils.bytecode = bytecode;
IOUtils.index = 0;
magic = IOUtils.readU4();
minorVersion = IOUtils.readU2();
majorVersion = IOUtils.readU2();
constantPoolCount = IOUtils.readU2();
Integer poolSize = TypeUtils.byteArr2Int(constantPoolCount.u2);
/*读取常量池*/
processConstantPool(constantPool, poolSize);
accessFlags = IOUtils.readU2();
thisClass = IOUtils.readU2();
superClass = IOUtils.readU2();
interfaceCount = IOUtils.readU2();
Integer interfaceCountInteger = TypeUtils.byteArr2Int(interfaceCount.u2);
interfaces = new U2[interfaceCountInteger];
for(Integer i = 0; i < interfaceCountInteger; i ++){
interfaces[i] = IOUtils.readU2();
}
fieldCount = IOUtils.readU2();
Integer fieldCountInteger = TypeUtils.byteArr2Int(fieldCount.u2);
fields = processFields( fieldCountInteger);
methodsCount = IOUtils.readU2();
Integer methodsCountInteger = TypeUtils.byteArr2Int(methodsCount.u2);
methods = processMethods( methodsCountInteger);
attributesCount = IOUtils.readU2();
Integer tempAttributesCount = TypeUtils.byteArr2Int(attributesCount.u2);
attributes = new AttributeBase[tempAttributesCount];
for(Integer i = 0; i < tempAttributesCount; i ++){
processAttribute( i, attributes);
}
}
/**
* 解析字节码中的方法
* @param methodsCountInteger
* @return
*/
private MethodInfo[] processMethods(Integer methodsCountInteger) {
MethodInfo[] methodInfos = new MethodInfo[methodsCountInteger];
for(Integer i = 0; i < methodsCountInteger; i ++){
methodInfos[i] = new MethodInfo();
methodInfos[i].accessFlags = IOUtils.readU2();
methodInfos[i].nameIndex = IOUtils.readU2();
methodInfos[i].descriptorIndex = IOUtils.readU2();
methodInfos[i].attributeCount = IOUtils.readU2();
Integer tempAttributesCount = TypeUtils.byteArr2Int(methodInfos[i].attributeCount.u2);
methodInfos[i].attributes = new AttributeBase[tempAttributesCount];
for(Integer j = 0; j < tempAttributesCount; j ++){
processAttribute( j, methodInfos[i].attributes);
}
}
return methodInfos;
}
/**
* 解析字节码中的字段
* @param fieldCountInteger
* @return
*/
private FieldInfo[] processFields(Integer fieldCountInteger) {
FieldInfo[] fieldInfos = new FieldInfo[fieldCountInteger];
for(Integer i = 0; i < fieldCountInteger; i ++){
fieldInfos[i] = new FieldInfo();
fieldInfos[i].accessFlags = IOUtils.readU2();
fieldInfos[i].nameIndex = IOUtils.readU2();
fieldInfos[i].descriptorIndex = IOUtils.readU2();
fieldInfos[i].attributeCount = IOUtils.readU2();
Integer tempAttributesCount = TypeUtils.byteArr2Int(fieldInfos[i].attributeCount.u2);
fieldInfos[i].attributes = new AttributeBase[tempAttributesCount];
for(Integer j = 0; j < tempAttributesCount; j ++){
processAttribute( j, fieldInfos[i].attributes);
}
}
return fieldInfos;
}
/**
* 解析字节码中的常量池
* @param constantPool
* @param poolSize
*/
private void processConstantPool(CpInfo constantPool, Integer poolSize) {
constantPool.cpInfo = new ConstantBase[poolSize];
for(Integer i = 0; i < poolSize - 1; i++){
U1 tag = IOUtils.readU1();
Integer integerTag = TypeUtils.byteArr2Int(tag.u1);
if(integerTag == 1){
ConstantUtf8 constantUtf8 = new ConstantUtf8();
constantUtf8.tag = tag;
constantUtf8.length = IOUtils.readU2();
Integer utf8Len = TypeUtils.byteArr2Int( constantUtf8.length.u2);
constantUtf8.bytes = new U1[utf8Len];
for(Integer j = 0; j < utf8Len; j ++){
constantUtf8.bytes[j] = IOUtils.readU1();
}
constantPool.cpInfo[i] = constantUtf8;
} else if(integerTag == 3){
ConstantInteger constantInteger = new ConstantInteger();
constantInteger.tag = tag;
constantInteger.bytes = IOUtils.readU4();
constantPool.cpInfo[i] = constantInteger;
} else if(integerTag == 4){
ConstantFloat constantFloat = new ConstantFloat();
constantFloat.tag = tag;
constantFloat.bytes = IOUtils.readU4();
constantPool.cpInfo[i] = constantFloat;
}else if (integerTag == 5){
ConstantLong constantLong = new ConstantLong();
constantLong.tag = tag;
constantLong.highBytes = IOUtils.readU4();
constantLong.lowBytes = IOUtils.readU4();
/*double和long类型会跳过一个常量标识*/
constantPool.cpInfo[i ++] = constantLong;
}else if(integerTag == 6){
ConstantDouble constantDouble = new ConstantDouble();
constantDouble.tag = tag;
constantDouble.highBytes = IOUtils.readU4();
constantDouble.lowBytes = IOUtils.readU4();
/*double和long类型会跳过一个常量标识*/
constantPool.cpInfo[i ++] = constantDouble;
}else if(integerTag == 7){
ConstantClass constantClass = new ConstantClass();
constantClass.tag = tag;
constantClass.nameIndex = IOUtils.readU2();
constantPool.cpInfo[i] = constantClass;
}else if(integerTag == 8){
ConstantString constantString = new ConstantString();
constantString.tag = tag;
constantString.stringIndex = IOUtils.readU2();
constantPool.cpInfo[i] = constantString;
}else if(integerTag == 9){
ConstantFieldref constantFieldref = new ConstantFieldref();
constantFieldref.tag = tag;
constantFieldref.classIndex = IOUtils.readU2();
constantFieldref.nameAndTypeIndex = IOUtils.readU2();
constantPool.cpInfo[i] = constantFieldref;
}else if(int
没有合适的资源?快使用搜索试试~ 我知道了~
zvm-jvm,使用java完成对jvm的设计,这个也是我的毕业设计的初稿.zip
共358个文件
java:327个
class:20个
xml:5个
需积分: 5 0 下载量 55 浏览量
2023-09-27
20:01:35
上传
评论
收藏 283KB ZIP 举报
温馨提示
zvm-jvm,使用java完成对jvm的设计,这个也是我的毕业设计的初稿
资源推荐
资源详情
资源评论
收起资源包目录
zvm-jvm,使用java完成对jvm的设计,这个也是我的毕业设计的初稿.zip (358个子文件)
Arrays.class 35KB
Class.class 33KB
String.class 18KB
Thread.class 14KB
AbstractStringBuilder.class 10KB
Integer.class 10KB
PrintStream.class 9KB
StringBuilder.class 9KB
Math.class 8KB
System.class 7KB
ObjectStreamField.class 4KB
Object.class 1KB
GCTest.class 1KB
FilterOutputStream.class 1KB
T1ClassLink.class 941B
OutputStream.class 825B
T0ClassLink.class 688B
FibonacciTest.class 549B
Number.class 529B
Simple0.class 282B
.gitignore 176B
zvm-mine.iml 80B
ClassFile.java 39KB
Interpreter.java 17KB
MethodArea.java 12KB
JavaClass.java 11KB
Opcode.java 9KB
Opcode1.java 6KB
JavaHeap.java 6KB
ArrayFields.java 5KB
GC.java 5KB
Ldc.java 4KB
PutField.java 4KB
CallSite.java 4KB
OperandStack.java 3KB
TypeUtils.java 3KB
InvokeVirtual.java 3KB
Cmd.java 3KB
GetField.java 3KB
InvokeStatic.java 3KB
PutStatic.java 2KB
ANewArray.java 2KB
Vars.java 2KB
GetStatic.java 2KB
InvokeSpecial.java 2KB
New.java 2KB
InvokeUtils.java 2KB
AccessFlag.java 2KB
Ldc2_W.java 2KB
NativeUtils.java 2KB
IOUtils.java 2KB
InvokeNative.java 1KB
ObjectFields.java 1KB
CodeUtils.java 1KB
System.java 1KB
PrimitiveArrayUtils.java 1KB
NewArray.java 1KB
Fcmpg.java 1KB
Aastore.java 976B
Dastore.java 974B
Fastore.java 970B
Lastore.java 967B
Iastore.java 964B
Aaload.java 941B
Daload.java 939B
Laload.java 938B
Faload.java 937B
Iaload.java 933B
ArrayLength.java 924B
Dcmpl.java 922B
Dcmpg.java 922B
Fcmpl.java 918B
Lcmp.java 917B
If_Icmple.java 873B
If_Icmpne.java 873B
If_Icmpge.java 873B
If_Icmpeq.java 873B
If_Icmpgt.java 872B
If_Icmplt.java 872B
Iinc.java 864B
Ifnonnull.java 863B
Aload.java 834B
Ifeq.java 812B
Ifle.java 800B
Ifne.java 800B
Ifge.java 800B
Ifgt.java 799B
Iflt.java 799B
Lload.java 797B
Dload.java 796B
Iload.java 794B
Fload.java 793B
Dadd.java 788B
Dsub.java 784B
Fsub.java 782B
Fadd.java 782B
Dmul.java 778B
Lsub.java 776B
Ladd.java 776B
ZVM.java 771B
共 358 条
- 1
- 2
- 3
- 4
资源评论
天天501
- 粉丝: 605
- 资源: 4666
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功