Skip to content

Commit

Permalink
Merge pull request #32 from yanghaitao0410/master
Browse files Browse the repository at this point in the history
Master
  • Loading branch information
diliuzuzhanghao authored Apr 12, 2017
2 parents cc06b54 + 3ac90d6 commit 39ca2c3
Show file tree
Hide file tree
Showing 23 changed files with 1,110 additions and 13 deletions.
6 changes: 5 additions & 1 deletion group06/1454385822/.classpath
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
<classpathentry kind="lib" path="C:/Users/yanght/Downloads/dom4j-1.6.1.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<attributes>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="bin"/>
</classpath>
6 changes: 6 additions & 0 deletions group06/1454385822/.project
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
Expand All @@ -13,5 +18,6 @@
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
</natures>
</projectDescription>
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.coding.basic.homework_04.jvm.attr;

public class AccessFlag {

private int flagValue;

public AccessFlag(int value) {
this.flagValue = value;
}

public int getFlagValue() {
return flagValue;
}

public void setFlagValue(int flagValue) {
this.flagValue = flagValue;
}

public boolean isPublicClass(){
return (this.flagValue & 0x0001) != 0;
}
public boolean isFinalClass(){
return (this.flagValue & 0x0010) != 0;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package com.coding.basic.homework_04.jvm.clz;

import com.coding.basic.homework_04.jvm.attr.AccessFlag;
import com.coding.basic.homework_04.jvm.constant.ConstantPool;

public class ClassFile {

private String MagicNumber;

private int minorVersion;
private int majorVersion;
private ConstantPool constantPool;
private int ConstantNum;
private ClassIndex clzIndex;

private AccessFlag accessFlag;



public AccessFlag getAccessFlag() {
return accessFlag;
}



public void setAccessFlag(AccessFlag accessFlag) {
this.accessFlag = accessFlag;
}



public ClassIndex getClzIndex() {
return clzIndex;
}



public void setClzIndex(ClassIndex clzIndex) {
this.clzIndex = clzIndex;
}



public int getConstantNum() {
return ConstantNum;
}



public void setConstantNum(int constantNum) {
ConstantNum = constantNum;
}



public void print() {
System.out.println("MagicNumber: "+ MagicNumber);
System.out.println( "minorVersion" +minorVersion);
System.out.println("majorVersion" + majorVersion);

}



public String getMagicNumber() {
return MagicNumber;
}



public void setMagicNumber(String magicNumber) {
MagicNumber = magicNumber;
}



public int getMinorVersion() {
return minorVersion;
}


public void setMinorVersion(int minorVersion) {
this.minorVersion = minorVersion;
}


public int getMajorVersion() {
return majorVersion;
}


public void setMajorVersion(int majorVersion) {
this.majorVersion = majorVersion;
}


public ConstantPool getConstantPool() {
return constantPool;
}


public void setConstantPool(ConstantPool constantPool) {
this.constantPool = constantPool;
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package com.coding.basic.homework_04.jvm.clz;

import java.io.UnsupportedEncodingException;

import com.coding.basic.homework_04.jvm.attr.AccessFlag;
import com.coding.basic.homework_04.jvm.constant.ConstantPool;
import com.coding.basic.homework_04.jvm.info.ClassInfo;
import com.coding.basic.homework_04.jvm.info.FieldRefInfo;
import com.coding.basic.homework_04.jvm.info.MethodRefInfo;
import com.coding.basic.homework_04.jvm.info.NameAndTypeInfo;
import com.coding.basic.homework_04.jvm.info.NullConstantInfo;
import com.coding.basic.homework_04.jvm.info.StringInfo;
import com.coding.basic.homework_04.jvm.info.UTF8Info;
import com.coding.basic.homework_04.jvm.util.ByteCodeIterator;

public class ClassFileParser {

private ClassFile classFile;

private ConstantPool pool;

public ClassFile parser(byte[] codes) {
ByteCodeIterator iterator = new ByteCodeIterator(codes);
classFile = new ClassFile();
classFile.setMagicNumber(iterator.nextU4ToHexString());
classFile.setMinorVersion(iterator.nextU2ToInt());
classFile.setMajorVersion(iterator.nextU2ToInt());
classFile.setConstantNum(iterator.nextU2ToInt());

System.out.println("Constant Pool Count :" + classFile.getConstantNum());

try {
classFile.setConstantPool(parserConstantPool(iterator));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

classFile.setAccessFlag(new AccessFlag(iterator.nextU2ToInt()));

ClassIndex clzIndex = new ClassIndex();
clzIndex.setThisClassIndex(iterator.nextU2ToInt());
clzIndex.setSuperClassIndex(iterator.nextU2ToInt());

classFile.setClzIndex(clzIndex);

return classFile;
}

private ConstantPool parserConstantPool(ByteCodeIterator iterator) throws UnsupportedEncodingException{
pool = new ConstantPool();


pool.addConstantInfo(new NullConstantInfo());
for(int i=1; i <= classFile.getConstantNum() - 1; i++){
int tag = iterator.nextU1toInt();

if(tag == 7){ //class info
ClassInfo clzInfo = new ClassInfo(pool);
clzInfo.setUtf8Index(iterator.nextU2ToInt());
pool.addConstantInfo(clzInfo);
}else if(tag == 1){ //utf8 info
UTF8Info utf8Info = new UTF8Info(pool);
utf8Info.setLength(iterator.nextU2ToInt());
String string = iterator.nextUxToHexString(utf8Info.getLength());
utf8Info.setValue(string);
// System.out.println(utf8Info.toString());

pool.addConstantInfo(utf8Info);
}else if(tag == 8){ //String info
StringInfo stringInfo = new StringInfo(pool);
stringInfo.setString_index(iterator.nextU2ToInt());
pool.addConstantInfo(stringInfo);
}else if(tag == 9){ //FieldRef info
FieldRefInfo fieldRefInfo = new FieldRefInfo(pool);
fieldRefInfo.setClz_index(iterator.nextU2ToInt());
fieldRefInfo.setNameAndType_index(iterator.nextU2ToInt());
pool.addConstantInfo(fieldRefInfo);
}else if(tag == 10){ //MethodRef info
MethodRefInfo methodRefInfo = new MethodRefInfo(pool);
methodRefInfo.setClass_index(iterator.nextU2ToInt());
methodRefInfo.setNameAndType_index(iterator.nextU2ToInt());
pool.addConstantInfo(methodRefInfo);
}else if(tag == 12){ //NameAndType info
NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool);
nameAndTypeInfo.setClz_index(iterator.nextU2ToInt());
nameAndTypeInfo.setDescriptor_index(iterator.nextU2ToInt());
pool.addConstantInfo(nameAndTypeInfo);
}else{
throw new RuntimeException("this tag" + tag+"has no already implement yet!!");
}
}
System.out.println("pool size:" +pool.getSize());

System.out.println("finished parser constantPool!!");
return pool;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.coding.basic.homework_04.jvm.clz;

public class ClassIndex {

private int thisClassIndex;
private int superClassIndex;
public int getThisClassIndex() {
return thisClassIndex;
}
public void setThisClassIndex(int thisClassIndex) {
this.thisClassIndex = thisClassIndex;
}
public int getSuperClassIndex() {
return superClassIndex;
}
public void setSuperClassIndex(int superClassIndex) {
this.superClassIndex = superClassIndex;
}



}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.coding.basic.homework_04.jvm.constant;

import org.omg.CORBA.PRIVATE_MEMBER;

public class ConstantInfo {

public static final int CLASS_INFO = 7;
public static final int UTF8_INFO = 1;
public static final int STRING_INFO = 8;
public static final int FIELDREF_INFO = 9;
public static final int METHODREF_INFO = 10;
public static final int NAMEANDTYPE_INFO = 12;

protected ConstantPool pool;
public ConstantInfo(){

}
public ConstantInfo(ConstantPool pool) {
this.pool = pool;
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.coding.basic.homework_04.jvm.constant;

import java.util.ArrayList;
import java.util.List;

import com.coding.basic.homework_04.jvm.info.UTF8Info;

public class ConstantPool {
private List<ConstantInfo> constantInfos = new ArrayList<ConstantInfo>();

public ConstantPool() {

}

public void addConstantInfo(ConstantInfo info){
constantInfos.add(info);
}

public int getSize() {
return this.constantInfos.size() - 1;
}


public ConstantInfo getConstantInfo(int type) {

return this.constantInfos.get(type);
}

public String getUTF8String(int index){
return ((UTF8Info)this.constantInfos.get(index)).getValue();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.coding.basic.homework_04.jvm.info;

import com.coding.basic.homework_04.jvm.constant.ConstantInfo;
import com.coding.basic.homework_04.jvm.constant.ConstantPool;

public class ClassInfo extends ConstantInfo {

public ClassInfo(ConstantPool pool) {
super(pool);
// TODO Auto-generated constructor stub
}
public ClassInfo() {
// TODO Auto-generated constructor stub
}

private int tag = ConstantInfo.CLASS_INFO;

private int utf8Index;

public int getTag() {
return tag;
}


public int getUtf8Index() {
return utf8Index;
}

public void setUtf8Index(int name_index) {
this.utf8Index = name_index;
}
public String getClassName() {
int utf8Index = getUtf8Index();
UTF8Info utf8Info = (UTF8Info)pool.getConstantInfo(utf8Index);
return utf8Info.getValue();
}






}
Loading

0 comments on commit 39ca2c3

Please sign in to comment.