diff --git a/group12/377401843/learning/pom.xml b/group12/377401843/learning/pom.xml
index f252611284..447c5546ce 100644
--- a/group12/377401843/learning/pom.xml
+++ b/group12/377401843/learning/pom.xml
@@ -20,6 +20,17 @@
1.6.1
+
+ org.apache.commons
+ commons-lang3
+ 3.0
+
+
+
+ commons-io
+ commons-io
+ 2.4
+
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/collection/ArrayList.java b/group12/377401843/learning/src/main/java/com/zhaogd/array/ArrayList.java
similarity index 87%
rename from group12/377401843/learning/src/main/java/com/zhaogd/collection/ArrayList.java
rename to group12/377401843/learning/src/main/java/com/zhaogd/array/ArrayList.java
index d3afc5e01a..d5c5fe04cc 100644
--- a/group12/377401843/learning/src/main/java/com/zhaogd/collection/ArrayList.java
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/array/ArrayList.java
@@ -1,7 +1,10 @@
-package com.zhaogd.collection;
+package com.zhaogd.array;
import java.util.Arrays;
+import com.zhaogd.collection.Iterator;
+import com.zhaogd.collection.List;
+
public class ArrayList implements List {
private int size = 0;
@@ -13,7 +16,7 @@ public class ArrayList implements List {
*
* @Method add
* @param o
- * @see com.guodong.datastructure.List#add(java.lang.Object)
+ * @see com.zhaogd.collection.guodong.datastructure.List#add(java.lang.Object)
*/
public void add(Object o) {
ensureCapacityInternal(size + 1);
@@ -27,7 +30,7 @@ public void add(Object o) {
* @Method add
* @param index
* @param o
- * @see com.guodong.datastructure.List#add(int, java.lang.Object)
+ * @see com.zhaogd.collection.guodong.datastructure.List#add(int, java.lang.Object)
*/
public void add(int index, Object o) {
checkRangeForAdd(index);
@@ -46,7 +49,7 @@ public void add(int index, Object o) {
* @Method get
* @param index
* @return
- * @see com.guodong.datastructure.List#get(int)
+ * @see com.zhaogd.collection.guodong.datastructure.List#get(int)
*/
public Object get(int index) {
checkRangeForGetOrRemove(index);
@@ -60,7 +63,7 @@ public Object get(int index) {
* @Method remove
* @param index
* @return
- * @see com.guodong.datastructure.List#remove(int)
+ * @see com.zhaogd.collection.guodong.datastructure.List#remove(int)
*/
public Object remove(int index) {
checkRangeForGetOrRemove(index);
@@ -80,7 +83,7 @@ public Object remove(int index) {
*
* @Method size
* @return
- * @see com.guodong.datastructure.List#size()
+ * @see com.zhaogd.collection.guodong.datastructure.List#size()
*/
public int size() {
return size;
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/collection/Queue.java b/group12/377401843/learning/src/main/java/com/zhaogd/collection/Queue.java
index d4a0647ab6..b81d015351 100644
--- a/group12/377401843/learning/src/main/java/com/zhaogd/collection/Queue.java
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/collection/Queue.java
@@ -1,5 +1,7 @@
package com.zhaogd.collection;
+import com.zhaogd.collection.linkedlist.LinkedList;
+
public class Queue {
private LinkedList element = new LinkedList();
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/collection/linkedlist/LRUPageFrame.java b/group12/377401843/learning/src/main/java/com/zhaogd/collection/linkedlist/LRUPageFrame.java
new file mode 100644
index 0000000000..39a4e4063d
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/collection/linkedlist/LRUPageFrame.java
@@ -0,0 +1,164 @@
+package com.zhaogd.collection.linkedlist;
+
+
+public class LRUPageFrame {
+
+ private static class Node {
+
+ Node prev;
+ Node next;
+ int pageNum;
+
+ Node() {
+ }
+ }
+
+ private int capacity;
+
+ private int currentSize;
+ private Node first;// 链表头
+ private Node last;// 链表尾
+
+
+ public LRUPageFrame(int capacity) {
+ this.currentSize = 0;
+ this.capacity = capacity;
+
+ }
+
+ /**
+ * 获取缓存中对象
+ *
+ * @param key
+ * @return
+ */
+ public void access(int pageNum) {
+
+ Node node = find(pageNum);
+ //在该队列中存在, 则提到队列头
+ if (node != null) {
+
+ moveExistingNodeToHead(node);
+
+ } else{
+
+ node = new Node();
+ node.pageNum = pageNum;
+
+ // 缓存容器是否已经超过大小.
+ if (currentSize >= capacity) {
+ removeLast();
+
+ }
+
+ addNewNodetoHead(node);
+
+
+
+
+ }
+ }
+
+ private void addNewNodetoHead(Node node) {
+
+ if(isEmpty()){
+
+ node.prev = null;
+ node.next = null;
+ first = node;
+ last = node;
+
+ } else{
+ node.prev = null;
+ node.next = first;
+ first.prev = node;
+ first = node;
+ }
+ this.currentSize ++;
+ }
+
+ private Node find(int data){
+
+ Node node = first;
+ while(node != null){
+ if(node.pageNum == data){
+ return node;
+ }
+ node = node.next;
+ }
+ return null;
+
+ }
+
+
+
+
+
+
+ /**
+ * 删除链表尾部节点 表示 删除最少使用的缓存对象
+ */
+ private void removeLast() {
+ Node prev = last.prev;
+ prev.next = null;
+ last.prev = null;
+ last = prev;
+ this.currentSize --;
+ }
+
+ /**
+ * 移动到链表头,表示这个节点是最新使用过的
+ *
+ * @param node
+ */
+ private void moveExistingNodeToHead(Node node) {
+
+ if (node == first) {
+
+ return;
+ }
+ else if(node == last){
+ //当前节点是链表尾, 需要放到链表头
+ Node prevNode = node.prev;
+ prevNode.next = null;
+ last.prev = null;
+ last = prevNode;
+
+ } else{
+ //node 在链表的中间, 把node 的前后节点连接起来
+ Node prevNode = node.prev;
+ prevNode.next = node.next;
+
+ Node nextNode = node.next;
+ nextNode.prev = prevNode;
+
+
+ }
+
+ node.prev = null;
+ node.next = first;
+ first.prev = node;
+ first = node;
+
+ }
+ private boolean isEmpty(){
+ return (first == null) && (last == null);
+ }
+
+ public String toString(){
+ StringBuilder buffer = new StringBuilder();
+ Node node = first;
+ while(node != null){
+ buffer.append(node.pageNum);
+
+ node = node.next;
+ if(node != null){
+ buffer.append(",");
+ }
+ }
+ return buffer.toString();
+ }
+
+
+
+}
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/collection/linkedlist/LRUPageFrameTest.java b/group12/377401843/learning/src/main/java/com/zhaogd/collection/linkedlist/LRUPageFrameTest.java
new file mode 100644
index 0000000000..b2fc8c8323
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/collection/linkedlist/LRUPageFrameTest.java
@@ -0,0 +1,34 @@
+package com.zhaogd.collection.linkedlist;
+
+import org.junit.Assert;
+
+import org.junit.Test;
+
+
+public class LRUPageFrameTest {
+
+ @Test
+ public void testAccess() {
+ LRUPageFrame frame = new LRUPageFrame(3);
+ frame.access(7);
+ frame.access(0);
+ frame.access(1);
+ Assert.assertEquals("1,0,7", frame.toString());
+ frame.access(2);
+ Assert.assertEquals("2,1,0", frame.toString());
+ frame.access(0);
+ Assert.assertEquals("0,2,1", frame.toString());
+ frame.access(0);
+ Assert.assertEquals("0,2,1", frame.toString());
+ frame.access(3);
+ Assert.assertEquals("3,0,2", frame.toString());
+ frame.access(0);
+ Assert.assertEquals("0,3,2", frame.toString());
+ frame.access(4);
+ Assert.assertEquals("4,0,3", frame.toString());
+ frame.access(5);
+ Assert.assertEquals("5,4,0", frame.toString());
+
+ }
+
+}
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/collection/LinkedList.java b/group12/377401843/learning/src/main/java/com/zhaogd/collection/linkedlist/LinkedList.java
similarity index 94%
rename from group12/377401843/learning/src/main/java/com/zhaogd/collection/LinkedList.java
rename to group12/377401843/learning/src/main/java/com/zhaogd/collection/linkedlist/LinkedList.java
index 136f53284e..78721b060a 100644
--- a/group12/377401843/learning/src/main/java/com/zhaogd/collection/LinkedList.java
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/collection/linkedlist/LinkedList.java
@@ -1,7 +1,10 @@
-package com.zhaogd.collection;
+package com.zhaogd.collection.linkedlist;
import java.util.NoSuchElementException;
+import com.zhaogd.collection.Iterator;
+import com.zhaogd.collection.List;
+
public class LinkedList implements List {
private int size;
@@ -15,7 +18,7 @@ public class LinkedList implements List {
*
* @Method add
* @param o
- * @see com.guodong.datastructure.List#add(java.lang.Object)
+ * @see com.zhaogd.collection.guodong.datastructure.List#add(java.lang.Object)
*/
public void add(Object o) {
linkLast(o);
@@ -27,7 +30,7 @@ public void add(Object o) {
* @Method add
* @param index
* @param o
- * @see com.guodong.datastructure.List#add(int, java.lang.Object)
+ * @see com.zhaogd.collection.guodong.datastructure.List#add(int, java.lang.Object)
*/
public void add(int index, Object o) {
checkIndexForAdd(index);
@@ -54,7 +57,7 @@ public void add(int index, Object o) {
* @Method get
* @param index
* @return
- * @see com.guodong.datastructure.List#get(int)
+ * @see com.zhaogd.collection.guodong.datastructure.List#get(int)
*/
public Object get(int index) {
checkIndexForGet(index);
@@ -71,7 +74,7 @@ public Object getLast() {
* @Method remove
* @param index
* @return
- * @see com.guodong.datastructure.List#remove(int)
+ * @see com.zhaogd.collection.guodong.datastructure.List#remove(int)
*/
public Object remove(int index) {
checkIndexForGet(index);
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/collection/Stack.java b/group12/377401843/learning/src/main/java/com/zhaogd/collection/stack/Stack.java
similarity index 80%
rename from group12/377401843/learning/src/main/java/com/zhaogd/collection/Stack.java
rename to group12/377401843/learning/src/main/java/com/zhaogd/collection/stack/Stack.java
index afb01f5f92..85a8800f39 100644
--- a/group12/377401843/learning/src/main/java/com/zhaogd/collection/Stack.java
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/collection/stack/Stack.java
@@ -1,4 +1,6 @@
-package com.zhaogd.collection;
+package com.zhaogd.collection.stack;
+
+import com.zhaogd.collection.linkedlist.LinkedList;
public class Stack {
private LinkedList elementData = new LinkedList();
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/collection/stack/StackUtil.java b/group12/377401843/learning/src/main/java/com/zhaogd/collection/stack/StackUtil.java
new file mode 100644
index 0000000000..ecf128b27e
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/collection/stack/StackUtil.java
@@ -0,0 +1,45 @@
+package com.zhaogd.collection.stack;
+
+public class StackUtil {
+
+
+ /**
+ * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5
+ * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助
+ */
+ public static void reverse(Stack s) {
+
+ }
+
+ /**
+ * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助
+ *
+ * @param o
+ */
+ public static void remove(Stack s,Object o) {
+
+ }
+
+ /**
+ * 从栈顶取得len个元素, 原来的栈中元素保持不变
+ * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助
+ * @param len
+ * @return
+ */
+ public static Object[] getTop(Stack s,int len) {
+ return null;
+ }
+ /**
+ * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz
+ * 使用堆栈检查字符串s中的括号是不是成对出现的。
+ * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true
+ * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的, 该方法返回false;
+ * @param s
+ * @return
+ */
+ public static boolean isValidPairs(String s){
+ return false;
+ }
+
+
+}
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/clz/AccessFlag.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/clz/AccessFlag.java
new file mode 100644
index 0000000000..1557b0ead2
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/clz/AccessFlag.java
@@ -0,0 +1,25 @@
+package com.zhaogd.jvm.clz;
+
+public class AccessFlag {
+ private int flagValue;
+
+ public AccessFlag(int value) {
+ this.flagValue = value;
+ }
+
+ public int getFlagValue() {
+ return flagValue;
+ }
+
+ public void setFlagValue(int flag) {
+ this.flagValue = flag;
+ }
+
+ public boolean isPublicClass(){
+ return (this.flagValue & 0x0001) != 0;
+ }
+ public boolean isFinalClass(){
+ return (this.flagValue & 0x0010) != 0;
+ }
+
+}
\ No newline at end of file
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/clz/ClassFile.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/clz/ClassFile.java
new file mode 100644
index 0000000000..bf6abbe3fd
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/clz/ClassFile.java
@@ -0,0 +1,75 @@
+package com.zhaogd.jvm.clz;
+
+import com.zhaogd.jvm.constant.ClassInfo;
+import com.zhaogd.jvm.constant.ConstantPool;
+
+public class ClassFile {
+
+ private int minorVersion;
+ private int majorVersion;
+
+ private AccessFlag accessFlag;
+ private ClassIndex clzIndex;
+ private ConstantPool pool;
+
+
+ public ClassIndex getClzIndex() {
+ return clzIndex;
+ }
+ public AccessFlag getAccessFlag() {
+ return accessFlag;
+ }
+ public void setAccessFlag(AccessFlag accessFlag) {
+ this.accessFlag = accessFlag;
+ }
+
+
+
+ public ConstantPool getConstantPool() {
+ return pool;
+ }
+ 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 void setConstPool(ConstantPool pool) {
+ this.pool = pool;
+
+ }
+ public void setClassIndex(ClassIndex clzIndex) {
+ this.clzIndex = clzIndex;
+ }
+
+
+
+
+ public void print(){
+
+ if(this.accessFlag.isPublicClass()){
+ System.out.println("Access flag : public ");
+ }
+ System.out.println("Class Name:"+ getClassName());
+
+ System.out.println("Super Class Name:"+ getSuperClassName());
+
+
+ }
+
+ private String getClassName(){
+ int thisClassIndex = this.clzIndex.getThisClassIndex();
+ ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex);
+ return thisClass.getClassName();
+ }
+ private String getSuperClassName(){
+ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex());
+ return superClass.getClassName();
+ }
+}
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/clz/ClassIndex.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/clz/ClassIndex.java
new file mode 100644
index 0000000000..0bdf47d002
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/clz/ClassIndex.java
@@ -0,0 +1,19 @@
+package com.zhaogd.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;
+ }
+}
\ No newline at end of file
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/ClassInfo.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/ClassInfo.java
new file mode 100644
index 0000000000..9851e063c0
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/ClassInfo.java
@@ -0,0 +1,24 @@
+package com.zhaogd.jvm.constant;
+
+public class ClassInfo extends ConstantInfo {
+ private int type = ConstantInfo.CLASS_INFO;
+ private int utf8Index ;
+ public ClassInfo(ConstantPool pool) {
+ super(pool);
+ }
+ public int getUtf8Index() {
+ return utf8Index;
+ }
+ public void setUtf8Index(int utf8Index) {
+ this.utf8Index = utf8Index;
+ }
+ public int getType() {
+ return type;
+ }
+
+ public String getClassName() {
+ int index = getUtf8Index();
+ UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index);
+ return utf8Info.getValue();
+ }
+}
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/ConstantInfo.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/ConstantInfo.java
new file mode 100644
index 0000000000..0afd79256b
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/ConstantInfo.java
@@ -0,0 +1,29 @@
+package com.zhaogd.jvm.constant;
+
+public abstract class ConstantInfo {
+ public static final int UTF8_INFO = 1;
+ public static final int FLOAT_INFO = 4;
+ public static final int CLASS_INFO = 7;
+ public static final int STRING_INFO = 8;
+ public static final int FIELD_INFO = 9;
+ public static final int METHOD_INFO = 10;
+ public static final int NAME_AND_TYPE_INFO = 12;
+ protected ConstantPool constantPool;
+
+ public ConstantInfo(){
+
+ }
+
+ public ConstantInfo(ConstantPool pool) {
+ this.constantPool = pool;
+ }
+ public abstract int getType();
+
+ public ConstantPool getConstantPool() {
+ return constantPool;
+ }
+ public ConstantInfo getConstantInfo(int index){
+ return this.constantPool.getConstantInfo(index);
+ }
+
+}
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/ConstantPool.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/ConstantPool.java
new file mode 100644
index 0000000000..4663d4d195
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/ConstantPool.java
@@ -0,0 +1,29 @@
+package com.zhaogd.jvm.constant;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ConstantPool {
+
+ private List constantInfos = new ArrayList();
+
+
+ public ConstantPool(){
+
+ }
+ public void addConstantInfo(ConstantInfo info){
+
+ this.constantInfos.add(info);
+
+ }
+
+ public ConstantInfo getConstantInfo(int index){
+ return this.constantInfos.get(index);
+ }
+ public String getUTF8String(int index){
+ return ((UTF8Info)this.constantInfos.get(index)).getValue();
+ }
+ public Object getSize() {
+ return this.constantInfos.size() -1;
+ }
+}
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/FieldRefInfo.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/FieldRefInfo.java
new file mode 100644
index 0000000000..bba61aea27
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/FieldRefInfo.java
@@ -0,0 +1,54 @@
+package com.zhaogd.jvm.constant;
+
+public class FieldRefInfo extends ConstantInfo{
+ private int type = ConstantInfo.FIELD_INFO;
+ private int classInfoIndex;
+ private int nameAndTypeIndex;
+
+ public FieldRefInfo(ConstantPool pool) {
+ super(pool);
+ }
+ public int getType() {
+ return type;
+ }
+
+ public int getClassInfoIndex() {
+ return classInfoIndex;
+ }
+ public void setClassInfoIndex(int classInfoIndex) {
+ this.classInfoIndex = classInfoIndex;
+ }
+ public int getNameAndTypeIndex() {
+ return nameAndTypeIndex;
+ }
+ public void setNameAndTypeIndex(int nameAndTypeIndex) {
+ this.nameAndTypeIndex = nameAndTypeIndex;
+ }
+
+ public String toString(){
+
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+
+ return getClassName() +" : "+ typeInfo.getName() + ":" + typeInfo.getTypeInfo() +"]";
+ }
+
+ public String getClassName(){
+
+ ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex());
+
+ UTF8Info utf8Info = (UTF8Info)this.getConstantInfo(classInfo.getUtf8Index());
+
+ return utf8Info.getValue();
+
+ }
+
+ public String getFieldName(){
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getName();
+ }
+
+ public String getFieldType(){
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getTypeInfo();
+ }
+}
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/MethodRefInfo.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/MethodRefInfo.java
new file mode 100644
index 0000000000..61c965bc0a
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/MethodRefInfo.java
@@ -0,0 +1,55 @@
+package com.zhaogd.jvm.constant;
+
+public class MethodRefInfo extends ConstantInfo {
+
+ private int type = ConstantInfo.METHOD_INFO;
+
+ private int classInfoIndex;
+ private int nameAndTypeIndex;
+
+ public MethodRefInfo(ConstantPool pool) {
+ super(pool);
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public int getClassInfoIndex() {
+ return classInfoIndex;
+ }
+ public void setClassInfoIndex(int classInfoIndex) {
+ this.classInfoIndex = classInfoIndex;
+ }
+ public int getNameAndTypeIndex() {
+ return nameAndTypeIndex;
+ }
+ public void setNameAndTypeIndex(int nameAndTypeIndex) {
+ this.nameAndTypeIndex = nameAndTypeIndex;
+ }
+
+ public String toString(){
+
+ return getClassName() +" : "+ this.getMethodName() + " : " + this.getParamAndReturnType() ;
+ }
+ public String getClassName(){
+ ConstantPool pool = this.getConstantPool();
+ ClassInfo clzInfo = (ClassInfo)pool.getConstantInfo(this.getClassInfoIndex());
+ return clzInfo.getClassName();
+ }
+
+ public String getMethodName(){
+ ConstantPool pool = this.getConstantPool();
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getName();
+ }
+
+ public String getParamAndReturnType(){
+ ConstantPool pool = this.getConstantPool();
+ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
+ return typeInfo.getTypeInfo();
+ }
+
+
+
+}
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/NameAndTypeInfo.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/NameAndTypeInfo.java
new file mode 100644
index 0000000000..aef7f16d1e
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/NameAndTypeInfo.java
@@ -0,0 +1,45 @@
+package com.zhaogd.jvm.constant;
+
+public class NameAndTypeInfo extends ConstantInfo{
+ public int type = ConstantInfo.NAME_AND_TYPE_INFO;
+
+ private int index1;
+ private int index2;
+
+ public NameAndTypeInfo(ConstantPool pool) {
+ super(pool);
+ }
+
+ public int getIndex1() {
+ return index1;
+ }
+ public void setIndex1(int index1) {
+ this.index1 = index1;
+ }
+ public int getIndex2() {
+ return index2;
+ }
+ public void setIndex2(int index2) {
+ this.index2 = index2;
+ }
+ public int getType() {
+ return type;
+ }
+
+
+ public String getName(){
+ ConstantPool pool = this.getConstantPool();
+ UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1);
+ return utf8Info1.getValue();
+ }
+
+ public String getTypeInfo(){
+ ConstantPool pool = this.getConstantPool();
+ UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2);
+ return utf8Info2.getValue();
+ }
+
+ public String toString(){
+ return "(" + getName() + "," + getTypeInfo()+")";
+ }
+}
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/NullConstantInfo.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/NullConstantInfo.java
new file mode 100644
index 0000000000..1cb411bee2
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/NullConstantInfo.java
@@ -0,0 +1,13 @@
+package com.zhaogd.jvm.constant;
+
+public class NullConstantInfo extends ConstantInfo {
+
+ public NullConstantInfo(){
+
+ }
+ @Override
+ public int getType() {
+ return -1;
+ }
+
+}
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/StringInfo.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/StringInfo.java
new file mode 100644
index 0000000000..c58bcb59d7
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/StringInfo.java
@@ -0,0 +1,26 @@
+package com.zhaogd.jvm.constant;
+
+public class StringInfo extends ConstantInfo{
+ private int type = ConstantInfo.STRING_INFO;
+ private int index;
+ public StringInfo(ConstantPool pool) {
+ super(pool);
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public int getIndex() {
+ return index;
+ }
+ public void setIndex(int index) {
+ this.index = index;
+ }
+
+
+ public String toString(){
+ return this.getConstantPool().getUTF8String(index);
+ }
+
+}
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/UTF8Info.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/UTF8Info.java
new file mode 100644
index 0000000000..c8b2e6a4c0
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/constant/UTF8Info.java
@@ -0,0 +1,32 @@
+package com.zhaogd.jvm.constant;
+
+public class UTF8Info extends ConstantInfo{
+ private int type = ConstantInfo.UTF8_INFO;
+ private int length ;
+ private String value;
+ public UTF8Info(ConstantPool pool) {
+ super(pool);
+ }
+ public int getLength() {
+ return length;
+ }
+ public void setLength(int length) {
+ this.length = length;
+ }
+ public int getType() {
+ return type;
+ }
+ @Override
+ public String toString() {
+ return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]";
+ }
+ public String getValue() {
+ return value;
+ }
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+
+
+}
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/loader/ByteCodeIterator.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/loader/ByteCodeIterator.java
new file mode 100644
index 0000000000..7147060b84
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/loader/ByteCodeIterator.java
@@ -0,0 +1,5 @@
+package com.zhaogd.jvm.loader;
+
+public class ByteCodeIterator {
+
+}
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/loader/ClassFileLoader.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/loader/ClassFileLoader.java
new file mode 100644
index 0000000000..6d04787a99
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/loader/ClassFileLoader.java
@@ -0,0 +1,140 @@
+package com.zhaogd.jvm.loader;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import com.zhaogd.jvm.clz.ClassFile;
+
+
+
+
+
+public class ClassFileLoader {
+
+ private List clzPaths = new ArrayList();
+
+ public byte[] readBinaryCode(String className) {
+
+ className = className.replace('.', File.separatorChar) +".class";
+
+ for(String path : this.clzPaths){
+
+ String clzFileName = path + File.separatorChar + className;
+ byte[] codes = loadClassFile(clzFileName);
+ if(codes != null){
+ return codes;
+ }
+ }
+
+ return null;
+
+
+
+ }
+
+ private byte[] loadClassFile(String clzFileName) {
+
+ File f = new File(clzFileName);
+
+ try {
+
+ return IOUtils.toByteArray(new FileInputStream(f));
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+
+
+ public void addClassPath(String path) {
+ if(this.clzPaths.contains(path)){
+ return;
+ }
+
+ this.clzPaths.add(path);
+
+ }
+
+
+
+ public String getClassPath(){
+ return StringUtils.join(this.clzPaths,";");
+ }
+
+ public ClassFile loadClass(String className) {
+ byte[] codes = this.readBinaryCode(className);
+ ClassFileParser parser = new ClassFileParser();
+ return parser.parse(codes);
+
+ }
+
+
+
+ // ------------------------------backup------------------------
+ public String getClassPath_V1(){
+
+ StringBuffer buffer = new StringBuffer();
+ for(int i=0;i", utf8Info.getValue());
+
+ utf8Info = (UTF8Info) pool.getConstantInfo(10);
+ Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
+
+ utf8Info = (UTF8Info) pool.getConstantInfo(11);
+ Assert.assertEquals("Code", utf8Info.getValue());
+ }
+
+ {
+ MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(12);
+ Assert.assertEquals(3, methodRef.getClassInfoIndex());
+ Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
+ }
+
+ {
+ NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
+ Assert.assertEquals(9, nameAndType.getIndex1());
+ Assert.assertEquals(14, nameAndType.getIndex2());
+ }
+ //抽查几个吧
+ {
+ MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45);
+ Assert.assertEquals(1, methodRef.getClassInfoIndex());
+ Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
+ }
+
+ {
+ UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
+ Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
+ }
+ }
+ @Test
+ public void testClassIndex(){
+
+ ClassIndex clzIndex = clzFile.getClzIndex();
+ ClassInfo thisClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
+ ClassInfo superClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
+
+
+ Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName());
+ Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
+ }
+
+
+
+}
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/test/EmployeeV1.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/test/EmployeeV1.java
new file mode 100644
index 0000000000..e9f656131b
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/test/EmployeeV1.java
@@ -0,0 +1,28 @@
+package com.zhaogd.jvm.test;
+
+public class EmployeeV1 {
+
+
+ private String name;
+ private int age;
+
+ public EmployeeV1(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+ public void setAge(int age){
+ this.age = age;
+ }
+ public void sayHello() {
+ System.out.println("Hello , this is class Employee ");
+ }
+ public static void main(String[] args){
+ EmployeeV1 p = new EmployeeV1("Andy",29);
+ p.sayHello();
+
+ }
+}
\ No newline at end of file
diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/jvm/util/Util.java b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/util/Util.java
new file mode 100644
index 0000000000..9c2fcc183e
--- /dev/null
+++ b/group12/377401843/learning/src/main/java/com/zhaogd/jvm/util/Util.java
@@ -0,0 +1,24 @@
+package com.zhaogd.jvm.util;
+
+public class Util {
+ public static int byteToInt(byte[] codes){
+ String s1 = byteToHexString(codes);
+ return Integer.valueOf(s1, 16).intValue();
+ }
+
+
+
+ public static String byteToHexString(byte[] codes ){
+ StringBuffer buffer = new StringBuffer();
+ for(int i=0;i